IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Mon programme Discussion :

[shareware][Java] Abc Course Pro - Atelier CRUD - Avis attendus


Sujet :

Mon programme

  1. #1
    Membre confirmé
    Avatar de william44290
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Juin 2009
    Messages
    400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 400
    Points : 575
    Points
    575
    Par défaut [shareware][Java] Atelier CRUD - Abc Course Pro - Avis attendus
    Nom : Abc Course Pro
    Préambule : ce soft est un prétexte à l'élaboration d'un Framework de production de logiciel de gestion.

    Objectifs du framework : gagner du temps et fournir une structure stable.

    Description du FrameWork :

    Modules standards
    Menu en BD
    Gestion des versions
    Intégration de look&feel
    Gestion des purges
    sauvegarde/Exportation
    Fiche & CRUD
    Liste & Edition
    Saisie en ligne
    calculatrice
    Calandrier mensuel/journalier
    Mini parser Html
    Gestion de préférences
    Gestion de licence & Version d'éval
    Gestion du feedback

    Modules applicatif
    Composants
    Contrôles de saisies par zone et validation par fiche
    Borne à borne de sélection
    Saisie directe dans les listes
    Gestion du focus
    Raccourci clavier
    Popup de Popup de panels
    Gestion des dates
    Edition série sur imprimante thermique
    ToolTip
    Status Bar
    Intégration sql et mappage
    Connecteur multi-base Sql (Sqlite et MySql)
    Maj automatique des tables par l'appli
    Console debug


    Le developpement de soft se limite aux :
    Modules Métier

    la définition/création des fiches de saisie.
    L'extension des modules pour les parties personnalisées.
    Ceux-ci s'appuient sur le pattern template
    Quelque bitmaps et icones pour que ce soit moins môche.


    Reste à faire :
    beaucoup de choses,
    intégration de composants riches (Jtree,JTabbebPane etc ...)
    Fonctionnement réseau (droit d'accés, bases réparties, accés concurrent etc..)
    Portage Web
    Aide
    Gestion des mises à jour
    etc etc etc

    tentative de modélisation du framework

    Gestion des projets------------Les packages du framework
    -----

    Description du soft : ABC Course Pro
    Version : 3.13f
    Langue : Francais


    ABC Course Pro vous propose de DIVERSIFIER votre alimentation, SURVEILLER vos dépenses,
    GAGNER DU TEMPS pour préparer et faire vos courses.
    Créer vos recettes de cuisines à partir des articles que vous achetez, créer vos planning par semaine et imprimer directement votre liste de course.( Les recettes et le planning c'est maman)
    Gagner du temps pour préparer votre liste en parcourant vos placards dans l'ordre ou vous les ranger et Remplissez votre caddie suivant l'ordre des rayons.(L'inventaire c'est les ados et papa rempli le caddie)
    Enregistrer les prix des articles ainsi le montant de vos courses sera directement calculé, le coût des repas aussi. (En fin de mois c'est bien pratique)
    Etonner votre famille avec de nouvelles recette, retrouver le plaisir de cuisiner. Une liste de course c'est la garantie de n'acheter que le nécessaire et la certitude de réaliser les repas prévus.

    Les packages métier ABC Course Pro------------Les class de la table magasin
    --------

    Compatibilité : Window, Mac test en cours peut-être linux.
    Nécessite : JRE 1.6
    Téléchargement : http://abcfamille.fr/ABCCoursePro.zip
    Licence : Shareware
    Langage : java/swing
    Application : Standalone java+sqlite
    Les sources : Sur demande
    Forum : http://abcfamille.forumactif.net

    A venir : ABC Nounou

  2. #2
    Membre confirmé
    Avatar de william44290
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Juin 2009
    Messages
    400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 400
    Points : 575
    Points
    575
    Par défaut quelques screen
    Table de base


    Table planning


    Table avec critères


    Saisie en ligne


    Recherche simple


    Popup liste F2


    Popup calculette


    Notification


    Traitement


    Préférences


    Impression d'une table


    Impression du planning


    Impression des courses

  3. #3
    Rédacteur
    Avatar de benwit
    Profil pro
    dev
    Inscrit en
    Septembre 2004
    Messages
    1 676
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : dev

    Informations forums :
    Inscription : Septembre 2004
    Messages : 1 676
    Points : 4 265
    Points
    4 265
    Par défaut
    Miam

    Pas con comme idée ...

    Ce qui est sympa dans la liste de course, c'est de mettre le prix précédent, comme ça, on voit l'évolution des prix.

    Pour éviter l'impression, un export lisible pour Iphone/Android ou même un client léger pour Iphone/Android, ça pourrait être sympa.

    Si les magasins exposaient leur prix via le web (comme amazon le fait), on pourrait même imaginer une appli qui transformerait Iphone/Android comme une scanette !!! (appareil photo = logiciel reconnaissance code barre existe)

    Tout le monde savait que c'était impossible. Il est venu un imbécile qui ne le savait pas et qui l'a fait. Marcel PAGNOL
    On ne savait pas que c'était impossible, alors on l'a fait. John Fitzgerald KENNEDY.
    L'inexpérience est ce qui permet à la jeunesse d'accomplir ce que la vieillesse sait impossible. Paul (Tristant) BERNARD
    La meilleure façon de prédire l'avenir, c'est de l'inventer.

  4. #4
    Membre confirmé
    Avatar de william44290
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Juin 2009
    Messages
    400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 400
    Points : 575
    Points
    575
    Par défaut
    Enfin un premier commentaire (Après 500 visites ).

    l'historique des prix c'est noté.

    Pour la liste sur l'Iphone :
    j'ai acheté un mac et un Iphone et faudrait que je m'y mette. Mais comme je n'ai que trois utilisateurs pour le moment je vais attendre.
    Cela fera l'objet d'une probable Version 4 (j'espère ).

    J'investi pour le moment sur un autre logiciel () et je complête le framework.

    benwit :c'est ma première expérience concrète java, as-tu des remarques à faire sur la réalisation ?

  5. #5
    Rédacteur
    Avatar de benwit
    Profil pro
    dev
    Inscrit en
    Septembre 2004
    Messages
    1 676
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : dev

    Informations forums :
    Inscription : Septembre 2004
    Messages : 1 676
    Points : 4 265
    Points
    4 265
    Par défaut
    L'idée de découpage partie générique (technique) / partie spécifique (métier) est plutôt bonne.

    Après, il sera intéressant de faire une autre application métier qui utilise à nouveau les composants de ton framework pour voir si c'est aussi indépendant que tu le penses.

    Tu as utilisé quoi comme composant pour faire des tableaux en Swing ?
    Un composant que tu as développé toi-même ?

    Tout le monde savait que c'était impossible. Il est venu un imbécile qui ne le savait pas et qui l'a fait. Marcel PAGNOL
    On ne savait pas que c'était impossible, alors on l'a fait. John Fitzgerald KENNEDY.
    L'inexpérience est ce qui permet à la jeunesse d'accomplir ce que la vieillesse sait impossible. Paul (Tristant) BERNARD
    La meilleure façon de prédire l'avenir, c'est de l'inventer.

  6. #6
    Membre confirmé
    Avatar de william44290
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Juin 2009
    Messages
    400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 400
    Points : 575
    Points
    575
    Par défaut
    Pour la validation du framework je suis d'accord avec toi et c'est ce que je suis en train de faire. Pour le moment cela ce passe bien. Je constate qu'il me manque des composants. Pour ceux déjà réalisés je n'ai eu qu'une méthode de pack à rajouter sur la gestion de popup.

    Le composant graphique du tableau est un panel de controle qui couple un JTable et d'autres panels : d'entête, de déplacement, de bouton et de recherche.
    Pour les données, j'ai choisi un accès aux tables en mode paginé et indexé.(Ce qui explique cette scrollBar qui est plutôt une PlayerBar)
    j'ai un objet sqlTool couplé au controleur pour l'accés aux tables.

    Au final je n'ai qu'un seul source de tableau pour tous les screens, j'ai essayé de réduire au minimum la création d'un tableau à :
    Nom table,Nombre de lignes, Hauteur de ligne
    liste des colonnes (Titre + Format d'affichage)
    liste des colonnes en saisie rapide

    Sinon je travaille sur un nouveau JTable pour un calendrier dans le cadre de la saisie des dates. ce qui fera deux jtables pour tous les screens

    Popup Calendrier journalier & mensuel


    auquel je doit associer deux nouveaux composant saisie de plage d'heures ou d'heures

    Popup plage d'heure & heure



  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2008
    Messages : 71
    Points : 90
    Points
    90
    Par défaut
    Le look & feel est très class et les vues sur les données sont très bien designées (grande clarté, cohérence d'ensemble, tous les alignements sont aux oignons, pas trop chargé). Bref l'application semble très lisible et son développement fort bien maitrisé ?

    Tu as tout codé tout seul ex-nihilo ?

  8. #8
    Membre confirmé
    Avatar de william44290
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Juin 2009
    Messages
    400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 400
    Points : 575
    Points
    575
    Par défaut
    Oui tout seul avec mes petits doigt en partant de zéro .
    Pour les alignements je fais confiance aux gestionnaire de layout.
    heu la maitrise du développement il y a du bon et du moins bon (y'a certaine bidouille dont je ne suis pas très fier) ce n'est que ma première réalisation java et cela a été assez laborieux.
    Ton avis me rassure car je craignais que l'utilisation des mêmes composants partout rende l'interface ennuieuse.

    Je prépare un nouveau soft et je souffre encore un peu plus. Mais je l'aurais un jour.

    yomhgui: est-ce que le schéma du framework te semble parlant ?

    Merci pour le compte rendu.

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Septembre 2008
    Messages : 71
    Points : 90
    Points
    90
    Par défaut
    Salut william,

    Je ne vais pas te dire que je comprends immédiatement et en intégralité la structure du soft en regardant le schéma mais on voit nettement se dégager certains concepts qui ont l'air structurants, notamment tous les endroits où il faut réaliser des transformations structurelles sur les données pour les utiliser de manière particulière (stockage <-> modèle objet, modèle objet <-> vues).

    Le simple fait de disposer d'une architecture est déjà une bonne chose et mon expérience industrielle m'a montré que c'est loin d'être toujours le cas. Cette même expérience qui amenait ma remarque du précédent post sur la qualité des vues (la maîtrise des Layout en particulier et de Swing en général est une chose qui est proche de l'anecdotique).

    Tout ça pour dire que je n'ai pas vu ni l'appli tourner, ni le code, ni le design de manière approfondie mais qu'en tous cas, au vue des snapshots, ça à l'air très réussi.

    En particulier, je trouve que ton idée de réglette de sélection de plages horaires est très intéressante sur un plan ergonomique.

    Beau travail donc...

  10. #10
    Membre confirmé
    Avatar de william44290
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Juin 2009
    Messages
    400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 400
    Points : 575
    Points
    575
    Par défaut ABC-Nounou Recherche Béta Testeurs.
    Les vacances ont-été profitables.

    Je vous présente les premiers screens d'un nouveau soft ABC Nounou, sur la base du framework décrit plus haut

    Description du soft : ABC Nounou
    Version : 0.67
    Langue : Francais

    Logiciel de Paie des nounous à l'attention des parents. Acceuil des nourissons et Péri-Scolaire. Gestion du pointage des heures. Intégration de l'annualisation et des congés payés. Gestion des frais et des indemnités. Gestion des contrats. Multi-gardes et multi-enfants. Consolidation déclarative la PAJE. Edition des bulletins de salaire.

    Le soft est en cours de développement, j'ai des doutes sur l'ergonomie du module : Saisie des pointages. Si un béta testeur ce porte volontaire cela me rendrai grand service.

    Merci d'avance pour vos commentaires et suggestions.

    La fiche Nounou :


    La saisie du pointage (qui m'a donné tant de mal) :


    Ce soft est l'occasion d'approfondir le formatage et le contrôle de saisie. Ainsi les contrôles Téléphones, N° URSSAF, N° Sécu ont été ajoutés au framework.
    ainsi que rangeDouble, rangeInt et NotZero.

    Les composants Date/Mois/plage d'heures/Calendrier ont été ajoutés au framework. Une class Day à été développée pour centraliser toutes les méthodes statiques usuelles du traitement de la date/mois/heure/temps.

    Une class Focus pour traiter le focus sur des panels sans composants focusable.

    Des modifications sur le CRUD ont aussi été nécessaires en particulier pour l'exploitation de valeurs de retour et la notification.

    Deuxième tentative de développer des composants digne de ce nom, à savoir un composant agrégeant des composants de base, ajoutable à un panel et gérant correctement son focus. (FocusTraversalPolicy).

  11. #11
    Membre confirmé
    Avatar de william44290
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Juin 2009
    Messages
    400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 400
    Points : 575
    Points
    575
    Par défaut
    Ajout de la saisie en ligne des contrats partie 1:


  12. #12
    Membre confirmé
    Avatar de william44290
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Juin 2009
    Messages
    400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 400
    Points : 575
    Points
    575
    Par défaut
    Ajout de la saisie en ligne des contrats partie 2:


    Ajout de la saisie en ligne des contrats partie 3:


    Cet ensemble Métier est un peu complexe mais l'intervention dans le source reste très structurée.

    Présentation du projet, (tous les screens)

  13. #13
    Membre confirmé
    Avatar de william44290
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Juin 2009
    Messages
    400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 400
    Points : 575
    Points
    575
    Par défaut
    Les nouvelles du front :

    Pas très glorieux.

    1) Les retours des béta-testeurs sont catastrophique, logiciel trop compliqué, calculs erronés bref gros plantage sur l'analyse. Je suis obligé de faire une refonte complète de l'application.

    2) Des problèmes de mémoire dans le framework 15 fenêtres appelées et le soft est à genou.

    Schématiquement mes composants n'étaient pas ramassés car des références persistaient dans des ArrayList,
    ou des class de service étaient référencées dans des PropertyChangeListener.

    Bref après analyse du code et utilisation de jconsole et MAP je me suis résolus à coder un mécanisme de déréférencement des composants et des class de services.

    J'ai implémenté une méthode dispose() pour tous ces objets ainsi que la méthode finalize().

    Les méthodes dispose() sont appelés en cascade et de manière hiérarchique.
    Les Méthodes finalize() moucharde la destruction réelle des objets lors du déclenchement du Gc.

    J'espère ne pas avoir d'autre mauvaise surprise de ce genre mais l'expérience était intéressante.

  14. #14
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Réimplémenter la méthode finalize tient plutôt du dirty hack qu'autre chose.

    Principalement tu devrais plutôt t'orienter vers tout ce qui est WeakReference et autres. Cf le tuto de gfx: http://gfx.developpez.com/tutoriel/j...rence-memoire/
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

  15. #15
    Membre confirmé
    Avatar de william44290
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Juin 2009
    Messages
    400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 400
    Points : 575
    Points
    575
    Par défaut
    Merci sinok de ton intéret.

    J'ai lu le tuto de Gfx et je perçois de quoi il est question mais je suis incapable de l'implémenter pour l'instant. Je vais me documenter.
    http://geeketfier.free.fr/index.php/...t-weakhashmap/
    http://geeketfier.free.fr/index.php/...softreference/
    http://bruce-eckel.developpez.com/li...chap=10&page=9

    Pour la méthode finalize, je ne fait absolument rien avec. Cette dernière m'a seulement permis de tracer avec certitude que les objets soient bien détruit.

  16. #16
    Membre confirmé
    Avatar de william44290
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Juin 2009
    Messages
    400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 400
    Points : 575
    Points
    575
    Par défaut
    Le connecteur SQL du framework ne supportait que le moteur SqlLite.
    Ajout du Moteur MySql :

    Les différences notables entre Sqlite et MySql :
    MySql ne supporte pas le ROWID
    Génération d'un champs ROWID AUTOINCREMENT UNIQUE et d'une PRIMARY KEY lors de la création de table

    Sqlite ne supporte pas la fonction CONCAT(), ne supporte pas de taille pour les VARCHAR, ne supporte pas les noms d'index

    Remplacement de l'opérateur || de concaténation sqlite par la fonction CONCAT() et modification des méthodes associées (JOIN,INDEX et les SELECT WHERE)
    Ajout de la taille des VARCHAR lors des CREATE et ALTER table

    Les modifications ont pris une petite demi-journée test compris.
    Le serveur Mysql que j'ai utilisé est peu performant l'établissement de la connexion m'a semblé un peu long environ 15 secondes.
    Test sur un serveur Mysql récent connexion en 4 secondes.
    Avec un serveur Mysql local la connexion est immédiate et semble même plus rapide que Sqlite.

    Reste à faire les test de charge avec MySql et l'ajout d'une boite de dailogue d'établissement de la connexion.

  17. #17
    Membre confirmé
    Avatar de william44290
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Juin 2009
    Messages
    400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 400
    Points : 575
    Points
    575
    Par défaut
    Suite du passage avec un serveur SQL.
    J'ai ajouté la gestion des utilisateurs et la sécurisation de l'application par mot de passe ainsi qu'une backdoor de choix de base de donnée (typiquement Dev vs exploitation).

    Bon, découvrir un nouveau langage, faire joujou avec c'est bien mais à un moment il faut que cela serve à quelque chose.

    J'ai donc pris la décision de me mettre au pieds du mur et de lancer cet atelier en production réel.

    Une nouvelle application à vue le jour. Il s'agit d'un projet multi-module à l'attention d'une usine agro-alimentaire devant couvrir la réception de matière, la gestion de la production et l'éxpédition des produits. Le tout avec une contrainte de gestion de tracabilité descendante et ascendante.

    Le premier module retenu est un module de saisie de la tracabilité des ateliers avec gestion de conformité des dlcs matières.

    La difficulté principale s'est concrétisée dans le contrôle de saisie qui se devait d'être dynamique et coercitif, ce qui n'est pas simple dans un environnement graphique.

    J'ai fait évoluer le framework pour intégrer ce type de contrainte en mettant au point un template de saisie qui évite la programmation spaguethi.

    Le module à été livré et sera mis en exploitation dans les jours suivants.

    Les screens à suivre.

  18. #18
    Membre confirmé
    Avatar de william44290
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Juin 2009
    Messages
    400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 400
    Points : 575
    Points
    575
    Par défaut
    Après quelques mois de développement :

    L'application de gestion de traçabilité s'étends dans de nombreux ateliers.(Exploitation en cours par une vingtaine de personnes).

    Malheureusement pour des raisons de confidentialité j'ai ne peux pas publier les screens.

    Par ailleurs, afin de gérer plus facilement les mises à jours j'ai réalisé un petit launcher de jar qui compare la date du jar source avec celui en exploitation, qui procède à la mise à jour si nécessaire et exécute la version finale.

    L'ensemble est constitué du jar et d'un fichier texte qui contient les paramètres d'une commande runtime.exec avec paramètres et changement de répertoire d'exécution. Dans le cas d'une mise à jour un splashscreen averti l'utilisateur d'une mise à jour en cours.

    Ceci vient en remplacement d'un système de batch qui n'est jamais très élégant sous window.

    Les sources sont disponibles pour qui en aurait l'utilité.

  19. #19
    Membre confirmé
    Avatar de william44290
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Juin 2009
    Messages
    400
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Juin 2009
    Messages : 400
    Points : 575
    Points
    575
    Par défaut
    Sur demande le code du launcher :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    package launch;
    import java.awt.Color;
    import java.awt.Graphics;
    import java.awt.Image;
    import java.awt.Toolkit;
    import java.awt.image.BufferedImage;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.net.ServerSocket;
    import java.net.URL;
    import java.nio.channels.FileChannel;
    import java.util.Scanner;
    
    import javax.swing.ImageIcon;
    import javax.swing.JOptionPane;
    import javax.swing.UIManager;
    import javax.swing.UnsupportedLookAndFeelException;
    
    public class Launch {
    	static final String FILE_DEBUT_PARAM = "launch.abc";
    	public static String AIMAGES    = "/aImages/";
    	static final int JAVAW=0;
    	static final int OPTION_JAR=1;
    	static final int SOURCE=2;
    	static final int DESTINATION=3;
    	static final int WORK=4;
    	static final int COMMAND=5;
    	String[] tmpParam;
    	public static void main(String[] args) {
    		new Launch();
    	}
    	public Launch(){
    		checkUniqueInstance(true, true);
    		if (isFileExists(FILE_DEBUT_PARAM)){
    			tmpParam=readParamFromFile(FILE_DEBUT_PARAM,6);
    			long source=getFileLastModified(getPathSource());
    			long destination=getFileLastModified(getPathDestination());
    			if (source>-1){
    				if (source>destination){
    					majFile(getPathSource(),getPathDestination(),true);
    				}
    				lanceDestination();
    			} else {
    				alerte();
    			}
    		} else {
    			alerte();
    		}
    	}
    	public void majFile(String pathSource, String pathDestination,boolean splash) {
    		ShadowedWindow window=null;
    		if (splash){
    			window = new ShadowedWindow(toBufferedImage(getImage("binaire.png")));
    			window.setVisible(true);
    		}
    		//	System.out.println("Copy lancée");
    		FileChannel in = null; 
    		FileChannel out = null;
    		try {
    			// Init
    			in = new FileInputStream(pathSource).getChannel();
    			out = new FileOutputStream(pathDestination).getChannel();
    
    			// Copie depuis le in vers le out
    			in.transferTo(0, in.size(), out);
    		} catch (Exception e) {
    			e.printStackTrace(); // n'importe quelle exception
    		} finally { // finalement on ferme
    			if(in != null) {
    				try {
    					in.close();
    				} catch (IOException e) {}
    			}
    			if(out != null) {
    				try {
    					out.close();
    				} catch (IOException e) {}
    			}
    		}		
    		//System.out.println("Copy finie");
    		if (splash){
    			window.dispose();
    		}
    	}
    	private Image getImage(String name){
    		Image ret=null;
    		if (name!=null){
    			URL url = this.getClass().getResource(AIMAGES +name);
    			if (url==null){
    				Toolkit toolkit = java.awt.Toolkit.getDefaultToolkit();
    				ret=toolkit.getImage(name);
    			}
    			if (url!=null){
    				ret = Toolkit.getDefaultToolkit().getImage(url);
    				url=null;
    			}
    		}
    		return ret;
    	}
    	private BufferedImage toBufferedImage(Image imag) {
    		BufferedImage ret=null;
    		Image image = new ImageIcon(imag).getImage();
    		ret = new BufferedImage( image.getWidth(null), image.getHeight(null), BufferedImage.TYPE_INT_RGB); 
    		Graphics g = ret.createGraphics(); 
    		g.setColor(Color.white); 
    		g.drawImage(image, 0, 0, null); 
    		g.dispose();
    		image=null;
    		imag=null;
    		return ret;
    	}
    
    	private void lanceDestination(){
    		try {
    			String[] paramDebut=new String[3];
    			paramDebut[0]=tmpParam[JAVAW];
    			paramDebut[1]=tmpParam[OPTION_JAR];
    			paramDebut[2]=tmpParam[DESTINATION]+tmpParam[COMMAND];
    			Runtime.getRuntime().exec(paramDebut,null,new File(tmpParam[WORK]));
    		} catch (IOException arg0) {
    			alerte();
    		}
    	}
    	private boolean isFileExists(String path){
    		boolean ret=false;
    		File file=new File(path);
    		ret=file.exists();
    		file=null;
    		return ret;
    	}
    	private long getFileLastModified(String path){
    		long ret=-1;
    		File file=new File(path);
    		ret=file.lastModified();
    		file=null;
    		return ret;
    	}
    	private String[] readParamFromFile(String file,int nbParam){
    		String [] ret=new String [nbParam];
    		if (isFileExists(file)){
    			try {
    				Scanner scanner = new Scanner(new File(file));
    				for (int i=0;i<nbParam;i++){
    					if (scanner.hasNextLine()){
    						ret[i]=scanner.nextLine();
    					} else {
    						ret[i]="";
    					}
    				}
    				scanner.close();
    				scanner=null;
    			} catch (FileNotFoundException arg0) { arg0.printStackTrace(); }
    		} else {
    			ret=null;
    		}
    		return ret;
    	}
    	private String getPathSource(){
    		return tmpParam[SOURCE]+tmpParam[COMMAND];
    	}
    	private String getPathDestination(){
    		return tmpParam[DESTINATION]+tmpParam[COMMAND];
    	}
    	private void alerte(){
    		JOptionPane.showMessageDialog(null,"Lancement de l'application, impossible, Manque le fichier '"+FILE_DEBUT_PARAM.toUpperCase()+"' ","MessageBox",JOptionPane.INFORMATION_MESSAGE);
    	}
    	private static int PORT = 1234;
    	@SuppressWarnings("unused")
    	private static ServerSocket ss;
    	private boolean checkUniqueInstance(boolean nbinstance,boolean quit){
    		try {
    			  UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
    		} catch (ClassNotFoundException arg0) {
    		} catch (InstantiationException arg0) {
    		} catch (IllegalAccessException arg0) {
    		} catch (UnsupportedLookAndFeelException arg0) {
    			arg0.printStackTrace();
    		}
    		boolean ret=false;
    		try { 
    			 
    			if (nbinstance) {
    				ss=new ServerSocket(PORT);
    			}
    			ret=true;
    		} catch(Exception e){
    			JOptionPane.showMessageDialog(null, "Ce programme est déjà lancé sur votre machine","Attention !!!", JOptionPane.INFORMATION_MESSAGE);
    			ret=false;
    			if (quit)
    				System.exit(0); 
    		}
    		return ret;
    	}
    }
    La popup :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    package launch;
    import java.awt.AWTException;
    import java.awt.Color;
    import java.awt.Cursor;
    import java.awt.Dimension;
    import java.awt.Font;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.Rectangle;
    import java.awt.Robot;
    import java.awt.image.BufferedImage;
    import java.awt.image.ConvolveOp;
    import java.awt.image.Kernel;
    
    import javax.swing.JWindow;
    import javax.swing.UIManager;
    
    public class ShadowedWindow extends JWindow {
    	private static final long serialVersionUID = 1L;
    	private BufferedImage splash = null;
        int extra = 14;
        static final Font FONTNORMAL = UIManager.getFont("Label.font").deriveFont(Font.PLAIN,UIManager.getFont("Label.font").getSize());
        static final Color 	INVALIDE_FG_RED = Color.RED;
        public ShadowedWindow(BufferedImage image) {
        	this.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR) ) ;
            createShadowPicture(image);
        }
    
        public void dispose(){
        	this.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR) ) ;
        	super.dispose();
        }
        public void paint(Graphics g) {
            if (splash != null) {
                g.drawImage(splash, 0, 0, null);
            	g.drawLine(0,0,1,this.getHeight()-extra-2);
            	g.drawLine(0,0,this.getWidth()-extra-2,1);
                g.setFont(FONTNORMAL.deriveFont(Font.BOLD,15f));
                g.setColor(INVALIDE_FG_RED);
                g.drawString("Mise à jour en cours, Merci de patienter", 40, this.getHeight()-200);
            }
        }
        
        private void createShadowPicture(BufferedImage image) {
            int width = image.getWidth();
            int height = image.getHeight();
    
            setSize(new Dimension(width + extra, height + extra));
            setLocationRelativeTo(null);
            Rectangle windowRect = getBounds();
    
            splash = new BufferedImage(width + extra, height + extra, BufferedImage.TYPE_INT_ARGB);
            Graphics2D g2 = (Graphics2D) splash.getGraphics();
    
            try {
                Robot robot = new Robot(getGraphicsConfiguration().getDevice());
                BufferedImage capture = robot.createScreenCapture(new Rectangle(windowRect.x, windowRect.y, windowRect.width + extra, windowRect.height + extra));
                g2.drawImage(capture, null, 0, 0);
            } catch (AWTException e) { }
    
            BufferedImage shadow = new BufferedImage(width + extra, height + extra, BufferedImage.TYPE_INT_ARGB); 
            Graphics g = shadow.getGraphics();
            g.setColor(new Color(0.0f, 0.0f, 0.0f, 0.3f));
            g.fillRoundRect(6, 6, width, height, 12, 12);
    
            g2.drawImage(shadow, getBlurOp(7), 0, 0);
            g2.drawImage(image, 0, 0, this);
        }
    
        private ConvolveOp getBlurOp(int size) {
            float[] data = new float[size * size];
            float value = 1 / (float) (size * size);
            for (int i = 0; i < data.length; i++) {
                data[i] = value;
            }
            return new ConvolveOp(new Kernel(size, size, data));
        }
    
    }
    Le fichier texte : launch.abc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    javaw
    -jar
    K:\app\soft\
    C:\
    C:\Documents and Settings\William\workspace\Appli
    Appli.jar

  20. #20
    Expert éminent sénior
    Avatar de sinok
    Profil pro
    Inscrit en
    Août 2004
    Messages
    8 765
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Points : 12 977
    Points
    12 977
    Par défaut
    Le fichier de launch tu feras comment pour l'adapter à chaque poste/ utilisateur?
    Ca semble quand même assez peu flexible. Il suffirait de déplacer son appli pour que plus rien ne marche.
    Hey, this is mine. That's mine. All this is mine. I'm claiming all this as mine. Except that bit. I don't want that bit. But all the rest of this is mine. Hey, this has been a really good day. I've eaten five times, I've slept six times, and I've made a lot of things mine. Tomorrow, I'm gonna see if I can't have sex with something.

Discussions similaires

  1. [Professionnalisation/Alternance] Developpement .NET/JAVA/WEB contrat pro
    Par max205gti dans le forum Demandes
    Réponses: 0
    Dernier message: 01/05/2010, 19h39
  2. Réponses: 31
    Dernier message: 24/12/2008, 10h31
  3. Reconversion pro, besoin d'avis
    Par Mazeltof dans le forum Etudes
    Réponses: 2
    Dernier message: 18/11/2008, 14h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo