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

Composants Java Discussion :

Problème NullPointerException JTextField.setText avec Netbeans


Sujet :

Composants Java

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Août 2008
    Messages
    256
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 256
    Points : 85
    Points
    85
    Par défaut Problème NullPointerException JTextField.setText avec Netbeans
    Bonjour à tous,

    Je vous sollicite en espérant que vous allez pouvoir élucider mon problème, voilà ! Je développe une application avec Netbeans et via un fichier XML je récupère des données que j'affecte dans des JTextField via la méthode setText, vous me direz ... Jusqu'ici tout est normal alors où le problème ?

    Le problème tient de la science fiction :
    Si je fais un copié/collé de mon code vers Eclipse tout fonctionne correctement je récupère bien mes données que j'affecte dans la JTextField en revanche sur Netbeans c'est pas la même histoire il m'affiche le message suivant : "Exception in thread "main" java.lang.NullPointerException" alors que c'est exactement e même code je n'ai rien changé.

    Je vous remercie d'avance à tous pour votre.

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Salut,

    Donne nous l'extrait de code, en nous précisant la ligne où arrive l'exception, avec la stacktrace.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Août 2008
    Messages
    256
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 256
    Points : 85
    Points
    85
    Par défaut
    Bonjour Joël !

    Merci une nouvelle fois de t'impliquer dans mes problèmes donc pour faire suite à demande voici une partie du code qui pose problème :

    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
     
        public static void LoadData() throws ParserConfigurationException, IOException, SAXException {
     
            org.w3c.dom.Document document;
     
            String xmlDoc = f.getAbsolutePath().substring(0, f.getAbsolutePath().length() - 1) + "hoteldata.xml";
            javax.xml.parsers.DocumentBuilderFactory builderFactory = javax.xml.parsers.DocumentBuilderFactory.newInstance();
            javax.xml.parsers.DocumentBuilder builder = builderFactory.newDocumentBuilder();
     
            document = builder.parse(new org.xml.sax.InputSource(xmlDoc));
     
            HoteldataScanner scanner = new HoteldataScanner(document);
            scanner.visitDocument();
     
            jTFNom.setText(scanner.name); /** L'erreur est ici ! */
     
        }
    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
     
        void visitElement_name(org.w3c.dom.Element element) {
            // <name>
            // element.getValue();
            org.w3c.dom.NodeList nodes = element.getChildNodes();
            for (int i = 0; i < nodes.getLength(); i++) {
                org.w3c.dom.Node node = nodes.item(i);
                switch (node.getNodeType()) {
                    case org.w3c.dom.Node.CDATA_SECTION_NODE:
                        // ((org.w3c.dom.CDATASection)node).getData();
                        break;
                    case org.w3c.dom.Node.ELEMENT_NODE:
                        org.w3c.dom.Element nodeElement = (org.w3c.dom.Element) node;
                        break;
                    case org.w3c.dom.Node.PROCESSING_INSTRUCTION_NODE:
                        // ((org.w3c.dom.ProcessingInstruction)node).getTarget();
                        // ((org.w3c.dom.ProcessingInstruction)node).getData();
                        break;
                    case org.w3c.dom.Node.TEXT_NODE:
                        // ((org.w3c.dom.Text)node).getData();
                        name = ((org.w3c.dom.Text)node).getData();
                        break;
                }
            }
        }
    Et l'erreur est la suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Exception in thread "main" java.lang.NullPointerException
    	at xxx.projet.BuildHotel.LoadData(BuildHotel.java:46)
    	at xxx.projet.BuildHotel.main(BuildHotel.java:289)
    J'espère que ça va t'aider

    Merci d'avance.

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Il faudrait savoir où et comment est créée l'instance de JTextField stockée dans jTFNom. Ni comment est initialisée cette variable, si elle l'est bien...
    Déjà, le fait qu'elle soit static favorise les problèmes : tu peux y accèder n'importe quand, alors qu'elle n'est pas forcément déjà initialisée (avant que ton UI soit construite). Je subodore un problème de threads : l'UI se contruit dans le thread SWING (Event Dispatch Thread - EDT), alors que le reste (le chargement de données par loadData()) s'exécute dans un autre thread (le thread principal de l'application à priori) : du coup, selon les environnements, le code des 2 threads ne s'exécute pas à la même vitesse, et donc dans un cas, l'UI est prête et dans l'autre, pas, au moment où tu affectes le texte à jTFNom.

    Organise différemment le code :

    1. Au lancement, charge les données dans tes classes de manipulation, qui ne doivent pas avoir de références à la GUI
    2. Puis tu lances ton code de construction d'UI, sur l'EDT, par un SwingUtilisties.invokeLater(), en lui passant les données pour initialiser les champs


    En gros, en simplifié :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Data data = load();
    SwingUtilties.invokeLater( ()-> new MyFrame(data) );
    Éventuellement, pour te simplifier ton programme, tu peux aussi faire une classe statique pour tes datas, donc au moment de l'intialisation de l'UI tu pourras y faire référence directement (plus besoin de le passer en paramètre de "MyFrame").

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public class Data {
     
       private static Data data;
     
       public static void loadData(File file) {
          data = ...
       }
     
       public static Data getData() {
             return data;
       }
     
    }

    Sinon String xmlDoc = f.getAbsolutePath().substring(0, f.getAbsolutePath().length() - 1) + "hoteldata.xml";, c'est bizarre. Enlever un caractère d'un path (si c'est un / ou un \\, l'enlever ne donne pas le même chemin qu'avec, et si c'est autre chose, pourquoi serait-il là ?). Un truc dans le genre String xmlDoc = new File(f, "hoteldata.xml").getAbsolutePath(); devrait fonctionner aussi bien, sinon plus généralement.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Août 2008
    Messages
    256
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 256
    Points : 85
    Points
    85
    Par défaut
    Ok ! J'ai noté ! Donc si j'ai bien compris entre les 2 (Eclipse et Netbeans) la gestion des threads ce fait différemment, étrangement étrange ??? Je n'aurai jamais imaginé une telle différence.

    Je voudrais rajouter un petit complément dans création et chargement de mes datas dont en voici le code :
    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
     
        public static void main(String args[]) throws ParserConfigurationException, IOException, SAXException {
            /* Set the Nimbus look and feel */
            //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
            /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
             * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
             */
            try {
                for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                    if ("Nimbus".equals(info.getName())) {
                        javax.swing.UIManager.setLookAndFeel(info.getClassName());
                        break;
                    }
                }
            } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | javax.swing.UnsupportedLookAndFeelException ex) {
                java.util.logging.Logger.getLogger(BuildHotel.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
            }
     
            /* CREER ET AFFICHE LE FORMULAIRE */
            java.awt.EventQueue.invokeLater(() -> {
                new BuildHotel().setVisible(true);
            });
     
            /** CHARGE LES DONNEES DU FORMULAIRE */
            LoadData();
        }
    J'ai un peu voir beaucoup triché dans la création de mon formulaire c'est à dire que c'est Netbeans qui m'a généré le code et j'ai remarqué qu'il était noté ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    "Nimbus".equals(info.getName())
    J'ai une tout autre définition du mot "Nimbus" , tu saurais à quoi cela fait référence ?

    Merci pour tout !

  6. #6
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Jb_One73 Voir le message
    Ok ! J'ai noté ! Donc si j'ai bien compris entre les 2 (Eclipse et Netbeans) la gestion des threads ce fait différemment, étrangement étrange ??? Je n'aurai jamais imaginé une telle différence.
    Ce n'est pas entre Eclipse et Netbeans, c'est entre 2 contextes d'exécutions différents : ça peut être 2 machines différentes (ou 2 configurations mémoire, processeur, etc..., 2 os différents, 2 instants différents (il peut se passer des choses en tâches de fond qui change la vitesse d'exécution), 2 codes différents (ton code va évolué, et tu n'auras peut être plus les mêmes conditions). À part nécessité absolue, il faut éviter que 2 threads manipulent les mêmes variables, et si on doit le faire, il y a des précautions à prendre).

    Citation Envoyé par Jb_One73 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ...
     
            /* CREER ET AFFICHE LE FORMULAIRE */
            java.awt.EventQueue.invokeLater(() -> {
                new BuildHotel().setVisible(true);
            });
     
            /** CHARGE LES DONNEES DU FORMULAIRE */
            LoadData();...
    Justement, là, on voit bien que tu lances l'UI dans l'EDT (le code commenté /* CREER ET AFFICHE LE FORMULAIRE */), qui va donc se lancer dans un thread à part... et le thread main continuant, il va appeler LoadData : aucune garantie que lorsque loadData() appellera jTFNom.setText(), jTFNom soit déjà initialisée.


    Citation Envoyé par Jb_One73 Voir le message
    J'ai un peu voir beaucoup triché dans la création de mon formulaire c'est à dire que c'est Netbeans qui m'a généré le code et j'ai remarqué qu'il était noté ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    "Nimbus".equals(info.getName())
    J'ai une tout autre définition du mot "Nimbus" , tu saurais à quoi cela fait référence ?
    Nimbus est le nom d'un thème d'UI (Look And Feel) : cela définit l'apparence et certains détails de fonctionnement de l'UI (on peut ainsi, avoir l'apparence d'avoir une UI MacOSX, ou Gnome, ou Windows ou autre...). Là, visiblement, NetBeans cherche à forcer le thème Nimbus s'il existe (Étonnamment, ce n'est pas fait dans l'EDT...pas bien).
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Août 2008
    Messages
    256
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 256
    Points : 85
    Points
    85
    Par défaut
    Maintenant les choses sont plus claire, je voudrais revenir sur un point. Je souhaiterai une de tes solutions que tu m'as proposé c'est à dire créer une classe data.
    J'ai quand même une question sur celle-ci :

    Dans mon cas présent il y a donc 2 Thread :
    1 pour le main et 1 pour la création du formulaire mais si j'invoque ma classe ne vais-je pas retomber dans le schéma actuel ? C'est à dire me retrouver avec ce problème d'exception.

    Je n'arrive pas à voir à quel moment je dois intérargir pour affecter mes données à mes objets d'autant plus que le code qui est généré avec "Netbeans" est verrouillé et par conséquent je ne peux pas le modifier.

    La programmation objet est assez compliquer je trouve ! Ça part un peu dans tous les sens ... j'ai vite fait de m'embrouiller et de ne plus rien comprendre.

    Merci pour ton aide.

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Août 2008
    Messages
    256
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 256
    Points : 85
    Points
    85
    Par défaut
    Bonjour Joël,

    Bon ! J'ai essayé dans tous les sens et à part avoir tout le temps ce maudit NullpointerException apparaître j'ai rien d'autre, je voudrais savoir s'il y avait une façon de savoir si la GUI est active ? Ceci me permettra (je l'espère) de charger mes datas ... Non ?

    Merci d'avance.

  9. #9
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Si tu charges les données avant de lancer la construction de l'UI et que tu continues à avoir null dans ta variable, c'est que tu n'iitialises jamais ta variable.

    Sinon, tu peux utiliser un WindowListener (ou WindowAdapter) sur ta JFrame, qui te notifiera lorsque la fenêtre est ouverte par sa méthode windowOpened().
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  10. #10
    Membre régulier
    Profil pro
    Inscrit en
    Août 2008
    Messages
    256
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 256
    Points : 85
    Points
    85
    Par défaut
    Quand tu me parles de variable, tu veux dire quoi ? Ex : String toto = Variable si c'est le cas, je n'ai aucun soucis avec celle-ci c'est uniquement lorsque j'affecte la valeur au jTextField.
    Afin d'avancer et pour éviter de perdre trop de temps (il m'a fallu 1 semaine pour créer 2 pages et j'ai 3 semaines pour tout finir) je poursuis avec Eclipse en fait je créé les pages avec Netbeans et le code avec Eclipse mais je ne m'avoue pas vaincu !

    Merci de ton aide.

  11. #11
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    je parle de jTFNom.

    Comment et où est initialisée cette variable ?
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Août 2008
    Messages
    256
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 256
    Points : 85
    Points
    85
    Par défaut
    Je vais te mettre une partie du code ma classe en espérant que cela pourra t'aider

    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
     
    /*
     * To change this license header, choose License Headers in Project Properties.
     * To change this template file, choose Tools | Templates
     * and open the template in the editor.
     */
    package xxx.projet;
     
    import java.io.File;
    import java.io.IOException;
    import javax.xml.parsers.ParserConfigurationException;
    import org.xml.sax.SAXException;
     
    /**
     *
     * @author xxxx.xxxx
     */
    public class BuildHotel extends javax.swing.JFrame {
     
        private static final File f = new File(".");
     
        /**
         * Creates new form BuildHotel
         */
        public BuildHotel() {
            initComponents();
        }
     
        /**
         * Chargement des informations concernant l'hôtel si elles existent
         * @throws javax.xml.parsers.ParserConfigurationException
         * @throws java.io.IOException
         * @throws org.xml.sax.SAXException  */
        public static void LoadData() throws SAXException, IOException, ParserConfigurationException{
            org.w3c.dom.Document document;
     
            String xmlDoc = f.getAbsolutePath().substring(0, f.getAbsolutePath().length() - 1) + "hoteldata.xml";
            javax.xml.parsers.DocumentBuilderFactory builderFactory = javax.xml.parsers.DocumentBuilderFactory.newInstance();
            javax.xml.parsers.DocumentBuilder builder = builderFactory.newDocumentBuilder();
     
            document = builder.parse(new org.xml.sax.InputSource(xmlDoc));
     
            HoteldataScanner scanner = new HoteldataScanner(document);
            scanner.visitDocument();   
     
            jTFNom.setText(scanner.name);
        }
        /**
         * This method is called from within the constructor to initialize the form.
         * WARNING: Do NOT modify this code. The content of this method is always
         * regenerated by the Form Editor.
         */
        @SuppressWarnings("unchecked")
        // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
        private void initComponents() {
     
            jPanelHotel = new javax.swing.JPanel();
            jLabel1 = new javax.swing.JLabel();
            jTFNom = new javax.swing.JTextField();
     
            setDefaultCloseOperation(javax.swing.WindowConstants.DO_NOTHING_ON_CLOSE);
            setTitle("xxxx- xxxx");
            setMaximumSize(new java.awt.Dimension(0, 0));
     
            jPanelHotel.setBorder(javax.swing.BorderFactory.createTitledBorder("Information sur l'hôtel"));
     
     
            javax.swing.GroupLayout jPanelHotelLayout = new javax.swing.GroupLayout(jPanelHotel);
            jPanelHotel.setLayout(jPanelHotelLayout);
            jPanelHotelLayout.setHorizontalGroup(
                jPanelHotelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                .addGroup(jPanelHotelLayout.createSequentialGroup()
                    .addGroup(jPanelHotelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanelHotelLayout.createSequentialGroup()
                            .addGap(0, 0, Short.MAX_VALUE)
                            .addGroup(jPanelHotelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                .addComponent(jLabel7)
                                .addComponent(jLabel5)))
                        .addGroup(jPanelHotelLayout.createSequentialGroup()
                            .addGroup(jPanelHotelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                .addGroup(jPanelHotelLayout.createSequentialGroup()
                                    .addGap(10, 10, 10)
                                    .addGroup(jPanelHotelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                        .addComponent(jLabel1)
                                        .addComponent(jLabel2)
                                        .addGroup(jPanelHotelLayout.createSequentialGroup()
                                            .addGap(10, 10, 10)
                                            .addComponent(jLabel4))))
                                .addGroup(jPanelHotelLayout.createSequentialGroup()
                                    .addContainerGap()
                                    .addComponent(jLabel3))
                                .addGroup(jPanelHotelLayout.createSequentialGroup()
                                    .addContainerGap()
                                    .addGroup(jPanelHotelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                        .addComponent(jLabel8)
                                        .addComponent(jLabel9))))
                            .addGap(0, 11, Short.MAX_VALUE)))
                    .addGroup(jPanelHotelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                        .addGroup(jPanelHotelLayout.createSequentialGroup()
                            .addComponent(jTFCP, javax.swing.GroupLayout.PREFERRED_SIZE, 46, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                            .addComponent(jTFVille, javax.swing.GroupLayout.PREFERRED_SIZE, 194, javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addComponent(jTFClasse, javax.swing.GroupLayout.PREFERRED_SIZE, 46, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addComponent(jTFEmail)
                        .addComponent(jTFNom)
                        .addComponent(jTFTel)
                        .addGroup(jPanelHotelLayout.createSequentialGroup()
                            .addComponent(jTFNumero, javax.swing.GroupLayout.PREFERRED_SIZE, 46, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                            .addComponent(jTFAdresse, javax.swing.GroupLayout.PREFERRED_SIZE, 194, javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addComponent(jTFWeb))
                    .addGap(26, 26, 26))
            );
     
            pack();
        }// </editor-fold>                        
     
        /** FERME LE FORMULAIRE */
        private void jBFermerActionPerformed(java.awt.event.ActionEvent evt) {                                         
            this.dispose();        
        }                                        
     
        /**
         * @param args the command line arguments
         * @throws javax.xml.parsers.ParserConfigurationException
         * @throws java.io.IOException
         * @throws org.xml.sax.SAXException
         */
        public static void main(String args[]) throws ParserConfigurationException, IOException, SAXException {
     
            /** CHARGE LES DONNEES DU FORMULAIRE */
     
     
            /* Set the Nimbus look and feel */
            //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
            /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
             * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
             */
            try {
                for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                    if ("Nimbus".equals(info.getName())) {
                        javax.swing.UIManager.setLookAndFeel(info.getClassName());
                        break;
                    }
                }
            } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | javax.swing.UnsupportedLookAndFeelException ex) {
                java.util.logging.Logger.getLogger(BuildHotel.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
            }
     
            /* CREE ET AFFICHE LE FORMULAIRE */
            java.awt.EventQueue.invokeLater(() -> {
                new BuildHotel().setVisible(true);
            });
     
            LoadData();
        }
     
        // Variables declaration - do not modify                
     
        static javax.swing.JTextField jTFNom;
     
        // End of variables declaration                   
    }
    Est ce que cela te convient ?

    Merci d'avance.

  13. #13
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    jTFNom est initialisée dans initComponents(), appelée dans le constructeur de BuildModel. Donc cette variable n'est pas null, dès qu'on a construit BuildModel.

    1. solution 1 : postload preopen (défaut, certains composants peuvent nécessiter d'avoir déjà été visible pour pouvoir être modifié : ça dépend de ton ui)
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
        /* CREER ET AFFICHE LE FORMULAIRE */
              java.awt.EventQueue.invokeLater(() -> {
                  BuildHotel buildHotel = new BuildHotel();
              /** CHARGE LES DONNEES DU FORMULAIRE */
                  LoadData();
                  buildHetel.setVisible(true);
              });
    2. solution 2 : postload postopen (défaut l'ui apparait vide pendant le temps du chargement, et surtouit on pourrait commencer à saisir)
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
        /* CREER ET AFFICHE LE FORMULAIRE */
              java.awt.EventQueue.invokeLater(() -> {
                  BuildHotel buildHotel = new BuildHotel();
                  buildHetel.setVisible(true);
                  LoadData();
              });
    3. solution 3 : postload postopening (défaut : si le chargement des données est long, l'ui met du temps à apparaître (vrai aussi pour la solution 1,)
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
        /* CREER ET AFFICHE LE FORMULAIRE */
              java.awt.EventQueue.invokeLater(() -> {
                  BuildHotel buildHotel = new BuildHotel();
                  buildHotel.addWindowsListener( new WindowsAdapter() {
                           public void windowOpened(WindowsEvent event) {
                                   /** CHARGE LES DONNEES DU FORMULAIRE */
                                   LoadData();
                           }
                  }
                  buildHetel.setVisible(true);
              });


    Défaut principal de toutes les méthodes : l'UI est boquée pendant le chargement
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Août 2008
    Messages
    256
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 256
    Points : 85
    Points
    85
    Par défaut
    Super ! Merci ! Joël !

    Tout fonctionne à merveille ... Tu es vraiment le meilleur.

    Bon ! J'ai un autre soucis mais qui touche xml donc je vais créer un nouveau post.

    Encore un grand MERCI c'est très cool !

  15. #15
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Pour clore cette discussion, je vais revenir sur la partie "Data" dont j'ai parlée au début, et vers laquelle tu as dit que tu voulais éventuellement t'orienter.

    Voilà une solution rapide (mais relativement fonctionnelle tout de même) d'exemple de ce que ça pourrait donner :

    Une classe pour stocker les données : ici j'ai juste 2 champs de type texte pour l'exemple (Rien de spécial, si ce n'est que tu y verras un exemple pour implémenter un système évenementiel pour écouter les changements sur le propriété) :

    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
    import java.beans.PropertyChangeListener;
     
    import javax.swing.event.SwingPropertyChangeSupport;
     
    public class Data {
     
    	public static final String PROPERTY_DATA_1 = "DATA1";
    	public static final String PROPERTY_DATA_2 = "DATA2";
    	public static final String PROPERTY_DIRTY = "DIRTY";
     
    	protected final SwingPropertyChangeSupport propertyChangeSupport = new SwingPropertyChangeSupport(this);
     
    	private String data1;
    	private String data2;
     
    	private boolean dirty;
     
    	public Data() {
    		data1=data2="";
    	}
     
    	public Data(String data1, String data2) {
    		this.data1=data1==null?"":data1;
    		this.data2=data2==null?"":data2;
    	}
     
    	public void setData1(String data1) {
    		if ( data1==null ) {
    			data1="";
    		}
    		if ( !this.data1.equals(data1) ) {
    			String old = this.data1;
    			this.data1=data1;
    			setDirty(true);
    			propertyChangeSupport.firePropertyChange(PROPERTY_DATA_1, old, data1);
    		}
    	}
     
    	public String getData1() {
    		return data1;
    	}
     
    	public void setData2(String data2) {
    		if ( data2==null ) {
    			data2="";
    		}
    		if ( !this.data2.equals(data2) ) {
    			String old = this.data2;
    			this.data2=data2;
    			setDirty(true);
    			propertyChangeSupport.firePropertyChange(PROPERTY_DATA_2, old, data2);
    		}
    	}
     
    	public String getData2() {
    		return data2;
    	}
     
    	private void setDirty(boolean dirty) {
    		if ( this.dirty!=dirty ) {
    			boolean old = this.dirty;
    			this.dirty=dirty;
    			propertyChangeSupport.firePropertyChange(PROPERTY_DIRTY, old, dirty);
    		}
    	}
     
    	public final boolean isDirty() {
    		return dirty;
    	}
     
    	public final void resetDirty() {
    		setDirty(false);
    	}
     
    	public final void addPropertyChangeListener(String propertyName, PropertyChangeListener listener) {
    		propertyChangeSupport.addPropertyChangeListener(propertyName, listener);
    	}
     
    	public final void removePropertyChangeListener(String propertyName, PropertyChangeListener listener) {
    		propertyChangeSupport.removePropertyChangeListener(propertyName, listener);
    	} 
     
    }
    Un pseudo DAO simplifié, avec fichier unique, de nom fixe, mais avec une implémentation qui permet de simuler des processus long de chargement ou de sauvegarde, qui peuvent géner l'UI.

    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
    198
    199
    200
    201
    202
    203
    import java.io.IOException;
    import java.nio.file.Files;
    import java.nio.file.Path;
    import java.nio.file.Paths;
    import java.util.concurrent.ExecutionException;
     
    import javax.swing.SwingWorker;
    import javax.xml.stream.XMLInputFactory;
    import javax.xml.stream.XMLOutputFactory;
    import javax.xml.stream.XMLStreamConstants;
    import javax.xml.stream.XMLStreamException;
    import javax.xml.stream.XMLStreamReader;
    import javax.xml.stream.XMLStreamWriter;
    import javax.xml.transform.stream.StreamResult;
    import javax.xml.transform.stream.StreamSource;
     
    public class DAO { 
     
    	private static final int LONG_JOB_TIME = 2000;
     
    	private static final String DATA2_ELEMENT = "data2";
    	private static final String DATA1_ELEMENT = "data1";
    	private static final String DATA_ELEMENT = "data";
     
    	public final static Path DATAFILE = Paths.get("data/data.dat");
     
    	public static Data loadData() {
    		Data data = new Data();
    		if (Files.exists(DATAFILE)) {
    			loadData(data);
    			data.resetDirty();
    		}
    		return data;
    	}
     
    	public static void longLoadData(LongLoadCallback callback) {
    		new LoadSwingWorker(callback).execute();
    	}
     
    	public static void longSaveData(Data data, LongSaveCallback callback) {
    		new SaveSwingWorker(data, callback).execute();
    	}
     
    	public static void saveData(Data data) { 
    		doSaveData(data, DATAFILE); 
    	}
     
    	private static void doSaveData(Data data, Path file) {
    		if (!Files.exists(file)) {
    			try {
    				Files.createDirectories(file.getParent());
    			} catch (IOException e) {
    				throw new RuntimeException(e);
    			}
    		}
    		XMLOutputFactory factory = XMLOutputFactory.newInstance();
     
    		try {
    			XMLStreamWriter writer = factory
    					.createXMLStreamWriter(new StreamResult(file.toFile().toString()));
     
    			writer.writeStartDocument();
    			writer.writeStartElement(DATA_ELEMENT);
    			writer.writeStartElement(DATA1_ELEMENT);
    			if (data.getData1() != null) {
    				writer.writeCData(data.getData1());
    			}
    			writer.writeEndElement();
    			writer.writeStartElement(DATA2_ELEMENT);
    			if (data.getData2() != null) {
    				writer.writeCData(data.getData2());
    			}
    			writer.writeEndElement();
    			writer.writeEndElement();
    			writer.writeEndDocument();
     
    			writer.flush();
    			writer.close();
     
    		} catch (XMLStreamException e) {
    			throw new RuntimeException(e);
    		}
    		data.resetDirty();
    	}
     
     
    	private static void loadData(Data data) {
    		XMLInputFactory factory = XMLInputFactory.newInstance();
    		String dataValue = null;
    		try {
    			XMLStreamReader reader = factory
    					.createXMLStreamReader(new StreamSource(DATAFILE.toString()));
    			while (reader.hasNext()) {
    				int next = reader.next();
    				switch (next) {
    				case XMLStreamConstants.CHARACTERS:
    					dataValue = reader.getText().trim();
    					break;
    				case XMLStreamConstants.END_ELEMENT:
    					switch (reader.getLocalName()) {
    					case DATA1_ELEMENT:
    						data.setData1(dataValue);
    						break;
    					case DATA2_ELEMENT:
    						data.setData2(dataValue);
    						break;
    					default:
    						break;
    					}
    					dataValue = null;
    					break;
    				default:
    					break;
    				}
    			}
    		} catch (XMLStreamException e) {
    			throw new RuntimeException(e); // simplification
    		}
     
    	}
     
     
    	private static class LoadSwingWorker extends SwingWorker<Data, Void> {
     
    		private final LongLoadCallback callback;
     
    		public LoadSwingWorker(LongLoadCallback callback) {
    			this.callback=callback;
    		}
     
    		@Override
    		protected Data doInBackground() throws Exception {
    			try {
    				Thread.sleep(LONG_JOB_TIME); // on simule un chargement long de 2
    									// secondes
    			} catch (InterruptedException e) {
    			}
    			return DAO.loadData();
    		}
     
    		@Override
    		protected void done() {
     
    			try {
    				callback.loaded(get());
    			} catch (InterruptedException | ExecutionException e) {
    				callback.error(e);
    			}
     
    		}
     
    	}
     
    	private static class SaveSwingWorker extends SwingWorker<Void, Void> {
     
    		private final Data data;
    		private final LongSaveCallback callback;
     
    		public SaveSwingWorker(Data data, LongSaveCallback callback) {
    			this.data=data;
    			this.callback=callback;
    		}
     
    		@Override
    		protected Void doInBackground() throws Exception { 
    			try {
    				Thread.sleep(LONG_JOB_TIME);// on simule une sauvegarde longue de 2
    									// secondes
    			} catch (InterruptedException e) {
    			} 
    			DAO.saveData(data);
    			return null;
    		}
     
    		@Override
    		protected void done() {
    			try {
    				get();
    			} catch (InterruptedException | ExecutionException e) { 
    				callback.error(e);
    			}
    			callback.saved(data);
    		}
     
    	}
     
    	public static interface LongLoadCallback {
     
    		void loaded(Data data);
     
    		void error(Exception e);
     
    	}
     
    	public static interface LongSaveCallback {
     
    		void saved(Data data);
     
    		void error(Exception e);
     
    	}
     
    }
    Mon UI, consitué d'une JFrame, avec 2 JTextField, des boutons sauver, charger et fermer. La seule chose à noter et que vue (UI) et modèle (Data) s'écoute l'un et l'autre). On empêche le bouclage évenementiel d'une part en testant si les propriétés changent et d'autre part avec un DocumentListener un peu spécial qui n'existe pas en standard dans SWING.

    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
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    import java.awt.BorderLayout;
    import java.awt.Component;
    import java.awt.FlowLayout;
    import java.awt.GridLayout;
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;
    import java.beans.PropertyChangeEvent;
    import java.beans.PropertyChangeListener;
    import java.util.Objects;
     
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    import javax.swing.JOptionPane;
    import javax.swing.JPanel;
    import javax.swing.JTextField;
     
    public class MyFrame extends JFrame {
     
    	private static final long serialVersionUID = 1L;
     
    	private JButton buttonSave;
    	private JButton buttonLoad;
    	private JButton buttonQuit;
     
    	private Data data;
    	private JTextField dataField1;
    	private JTextField dataField2;
    	private PropertyChangeListener listenerData = p-> changeData(p);
    	private PropertyChangeListener listenerDirty = p-> changeDirty(p);
    	private boolean longjob; 
     
    	public MyFrame(Data data) {
    		this(false);
    		setData(data);
    	}
     
    	public MyFrame(boolean longJob, Data data) {
    		this(longJob);
    		setData(data);
    	}
     
    	public MyFrame() {
    		this(false);
    	}
     
    	public MyFrame(boolean longjob) {
    		super("Ma fenêtre");
    		this.longjob=longjob;
    		setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
    		build();
    		pack();
    		setResizable(false);
    		setLocationRelativeTo(null);
    		addWindowListener(new WindowAdapter() {
    			@Override
    			public void windowClosing(WindowEvent e) {
    				close();
    			}
    			@Override
    			public void windowClosed(WindowEvent e) {
    			}
    		});
    		this.data = new Data();
    		connectData();
    	}
     
    	private void build() {
    		JPanel panel = new JPanel();
    		panel.setLayout(new BorderLayout());
    		getContentPane().add(panel);
    		panel.add(createForm(), BorderLayout.CENTER);
    		panel.add(createActions(), BorderLayout.SOUTH);
    	}
     
    	private Component createForm() {
    		JPanel panel = new JPanel();
    		panel.setLayout(new GridLayout(0,2)); // pour aller au plus vite, même si ce n'est pas très jojo ;)
    		panel.add(new JLabel("Data 1"));
    		dataField1 = new JTextField(20);
    		panel.add(dataField1);
    		panel.add(new JLabel("Data 2"));
    		dataField2 = new JTextField(20);
    		panel.add(dataField2);
     
    		Utils.addChangeListener(dataField1, e-> changeData(dataField1));
    		Utils.addChangeListener(dataField2, e-> changeData(dataField2));
     
     
    		return panel;
    	}
     
    	private Component createActions() {
    		JPanel panel = new JPanel();
    		panel.setLayout(new FlowLayout(FlowLayout.RIGHT));
    		buttonLoad = new JButton("Charger");
    		panel.add(buttonLoad);
    		buttonLoad.addActionListener(e-> loadData());
    		buttonSave = new JButton("Sauver");
    		buttonSave.addActionListener(e-> saveData());
    		buttonSave.setEnabled(false);
    		panel.add(buttonSave);
    		buttonQuit = new JButton("Quitter");
    		buttonQuit.addActionListener(e-> quit());
    		panel.add(buttonQuit);
    		return panel;
    	}
     
    	public void loadData() {
    		if ( longjob ) {
    			setEnabledForm(false);
    			DAO.longLoadData(new DAO.LongLoadCallback() {
     
    				@Override
    				public void loaded(Data data) {
    					if (isDisplayable()) {
    						setData(data);
    						setEnabledForm(true);
    					}
    				}
     
    				@Override
    				public void error(Exception e) {
    					e.printStackTrace();
    					JOptionPane.showMessageDialog(MyFrame.this,
    							"Erreur pendant le chargement du fichier",
    							"Erreur...", JOptionPane.ERROR_MESSAGE);
    				}
    			}); 
    		}
    		else {
    			setData(DAO.loadData());
    		}
    	}
     
    	public void setEnabledForm(boolean enabled) {
    		setEnabledButtons(enabled);
    		dataField1.setEnabled(enabled);
    		dataField2.setEnabled(enabled);
    	}
     
    	public void setEnabledButtons(boolean enabled) {
    		buttonLoad.setEnabled(enabled);
    		buttonSave.setEnabled(!enabled?enabled:data.isDirty());
    	}
     
    	public void saveData() {
    		Utils.swingAsyncExec(()-> doSaveData());
    	}	
     
    	public void saveDataIfNecessary() {
    		Utils.swingAsyncExec(()-> {
    		if ( data.isDirty() ) {
    			doSaveData();
    		}
    		});
    	}
     
    	private void doSaveData() {
    		if  ( longjob ) { 
    			setEnabledButtons(false);
    			DAO.longSaveData(getData(), new DAO.LongSaveCallback() {
     
    				@Override
    				public void saved(Data data) {
    					if (isDisplayable()) {
    						setEnabledButtons(true);
    					}
    				}
     
    				@Override
    				public void error(Exception e) {
    					e.printStackTrace();
    					JOptionPane.showMessageDialog(MyFrame.this,
    							"Erreur pendant la sauvegarde du fichier",
    							"Erreur...", JOptionPane.ERROR_MESSAGE);
    				}
     
    			});  
    		}
    		else {
    			DAO.saveData(data);
    		}
    	}
     
    	public void quit() {
    		Utils.swingAsyncExec(()-> close());
    	}
     
    	public void close() {
    		if ( data.isDirty() ) {
    			switch (JOptionPane.showConfirmDialog(MyFrame.this, 
    					"Voulez-vous sauvegarder vos dernières modifications ?", 
    					"Fermer l'application", JOptionPane.YES_NO_CANCEL_OPTION) ) {
    			case JOptionPane.YES_OPTION:
    				DAO.saveData(data);
    			case JOptionPane.NO_OPTION:
    				dispose();	
    				break;
    			default:
    				break;
    			} 
    		}
    		else {
    			if ( JOptionPane.showConfirmDialog(MyFrame.this, "Voulez-vous vraiment fermer l'application ?", "Fermer l'application", JOptionPane.YES_NO_OPTION)==JOptionPane.YES_OPTION ) {
    				dispose();
    			}
    		}
    	}
     
    	public void setData(Data data) {
    		Objects.requireNonNull(data);
    		Utils.swingAsyncExec(()-> {
    			disconnectData();
    			this.data=data;
    			populateFields();
    			connectData();
    		});
    	}
     
    	public Data getData() {
    		return data;
    	}
     
    	private void populateFields() {
    		String data1 = data.getData1();
    		changeDataField(dataField1, data1);
    		String data2 = data.getData2();
    		changeDataField(dataField2, data2);
    		buttonSave.setEnabled(data.isDirty());
    	}
     
    	private void connectData() {
    		data.addPropertyChangeListener(Data.PROPERTY_DATA_1, listenerData );
    		data.addPropertyChangeListener(Data.PROPERTY_DATA_2, listenerData);
    		data.addPropertyChangeListener(Data.PROPERTY_DIRTY, listenerDirty);
    	}
     
    	private void disconnectData() {
    		data.removePropertyChangeListener(Data.PROPERTY_DATA_1, listenerData );
    		data.removePropertyChangeListener(Data.PROPERTY_DATA_2, listenerData);
    		data.removePropertyChangeListener(Data.PROPERTY_DIRTY, listenerDirty);
    	}
     
    	private void changeData(JTextField field) {
    		if ( field==dataField1 ) {
    			data.setData1(dataField1.getText());
    		}
    		else if ( field==dataField2 ) {
    			data.setData2(dataField2.getText());
    		}
    	}
     
    	private void changeData(PropertyChangeEvent propertyChangeEvent) {
    		Utils.swingAsyncExec(()-> {
    			if ( Data.PROPERTY_DATA_1.equals(propertyChangeEvent.getPropertyName()) ) {
    				changeDataField(dataField1, propertyChangeEvent);
    			}
    			else if ( Data.PROPERTY_DATA_2.equals(propertyChangeEvent.getPropertyName()) ) {
    				changeDataField(dataField2, propertyChangeEvent);
    	 		}
    		});
    	}
     
    	private void changeDataField(JTextField dataField,
    			PropertyChangeEvent propertyChangeEvent) {
    		changeDataField(dataField, (String)propertyChangeEvent.getNewValue());
    	}
     
    	private void changeDataField(JTextField dataField,
    			String newValue) {
    		if ( newValue==null ) {
    			newValue="";
    		}
    		if ( !dataField.getText().equals(newValue) ) {
    			dataField.setText(newValue);
    		}
    	}
     
    	private void changeDirty(PropertyChangeEvent p) {
    		Utils.swingAsyncExec(()-> {
    			boolean dirty = (boolean)p.getNewValue();
    			if ( dirty ) {
    				populateFields();
    			}
    			buttonSave.setEnabled(dirty);
    		});
    	}  
     
    }
    Une petite classe d'utilitaires, parce qu'on a toujours besoin d'utilitaires :

    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
    import java.util.Objects;
     
    import javax.swing.SwingUtilities;
    import javax.swing.event.ChangeEvent;
    import javax.swing.event.ChangeListener;
    import javax.swing.event.DocumentEvent;
    import javax.swing.event.DocumentListener;
    import javax.swing.text.Document;
    import javax.swing.text.JTextComponent;
     
     
    public class Utils {
     
    	public static void addChangeListener(JTextComponent text, ChangeListener changeListener) {
    	    Objects.requireNonNull(text);
    	    Objects.requireNonNull(changeListener);
    	    DocumentListener listener = new DocumentListener() {
    	        private int lastChange = 0, lastNotifiedChange = 0;
     
    	        @Override
    	        public void insertUpdate(DocumentEvent e) {
    	            changedUpdate(e);
    	        }
     
    	        @Override
    	        public void removeUpdate(DocumentEvent e) {
    	            changedUpdate(e);
    	        }
     
    	        @Override
    	        public void changedUpdate(DocumentEvent e) {
    	            lastChange++;
    	            SwingUtilities.invokeLater(() -> {
    	                if (lastNotifiedChange != lastChange) {
    	                    lastNotifiedChange = lastChange;
    	                    changeListener.stateChanged(new ChangeEvent(text));
    	                }
    	            });
    	        }
    	    };
    	    text.addPropertyChangeListener("document", e -> {
    	        Document od = (Document)e.getOldValue();
    	        Document nd = (Document)e.getNewValue();
    	        if (od != null) od.removeDocumentListener(listener);
    	        if (nd != null) od.addDocumentListener(listener);
    	    });
    	    Document d = text.getDocument();
    	    if (d != null) d.addDocumentListener(listener);
    	}
     
    	public static void swingAsyncExec(Runnable runnable) {
    		if ( SwingUtilities.isEventDispatchThread() ) {
    			runnable.run();
    		}
    		else {
    			SwingUtilities.invokeLater(runnable);
    		}
    	}
     
    }
    Ensuite, voilà l'exemple en chargement après ouverture mais avant affichage :
    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
    public class ExemplePostLoadPostOpen {
     
    	public static void main(String[] args) {
     
    		SwingUtilities.invokeLater(()-> {
    			MyFrame frame = new MyFrame();
    			frame.addWindowListener(new WindowAdapter() {
     
    				public void windowOpened(WindowEvent event) {
    					Data data = DAO.loadData();
    					frame.setData(data);
    				}
     
    			});
    			frame.setVisible(true);
    		});
     
    	}
    }
    L'exemple en chargement avant création et affichage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public class ExemplePreLoadPreOpen {
     
    	public static void main(String[] args) {
     
    		Data data = DAO.loadData();
     
    		SwingUtilities.invokeLater(()-> {
    			MyFrame frame = new MyFrame(data);
    			frame.setVisible(true);
    		});
     
    	}
    }
    Un exemple avec simulation de chargement/sauvegarde long (sans bloquer l'UI) :

    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
    public class ExemplePostLoadPostOpenLong {
     
    	public static void main(String[] args) {
     
    		SwingUtilities.invokeLater(()-> {
    			MyFrame frame = new MyFrame(true);
    			frame.addWindowListener(new WindowAdapter() {
     
    				@Override
    				public void windowOpened(WindowEvent e) {
    					frame.setEnabledForm(false);
    					DAO.longLoadData(new DAO.LongLoadCallback() {
     
    						@Override
    						public void loaded(Data data) {
    							if (frame.isDisplayable()) {
    								frame.setData(data);
    								frame.setEnabledForm(true);
    							}
    						}
     
    						@Override
    						public void error(Exception e) {
    							e.printStackTrace();
    							JOptionPane.showMessageDialog(frame,
    									"Erreur pendant le chargement du fichier",
    									"Erreur...", JOptionPane.ERROR_MESSAGE);
    						}
     
    					}); 
    				} 
     
     
    			});
    			frame.setVisible(true);
    		});
     
    	}
     
    }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  16. #16
    Membre régulier
    Profil pro
    Inscrit en
    Août 2008
    Messages
    256
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 256
    Points : 85
    Points
    85
    Par défaut
    Super ! Merci Joël !

    Tout fonctionne à merveille ! Tu es vraiment le meilleur !!!

    Un grand MERCI pour ton aide et maintenant je vais mettre un nouveau post sur le forum car j'ai une nouvelle fois un problème mais qui concerne XML cette fois-ci.

    Merci Joël pour tout.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème ouverture de fichiers avec NetBeans
    Par miouzeu dans le forum NetBeans
    Réponses: 5
    Dernier message: 19/09/2012, 17h11
  2. Problème de "transaction aborted" avec netbeans
    Par salisup dans le forum NetBeans
    Réponses: 0
    Dernier message: 03/06/2011, 12h12
  3. problème encodage des caractère avec netbeans
    Par space2alk dans le forum NetBeans
    Réponses: 3
    Dernier message: 19/07/2010, 16h34
  4. Mon problème avec NetBeans 5.0
    Par Djama dans le forum NetBeans
    Réponses: 1
    Dernier message: 22/05/2007, 23h12
  5. Réponses: 5
    Dernier message: 04/07/2006, 00h11

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