Partage
  • Partager sur Facebook
  • Partager sur Twitter

JDialog en modal et non accessibilité des listener

listeners implémentés hors la classe qui crée la JDialog

Sujet résolu
    15 octobre 2018 à 19:51:36

    Bonsoir,

    Je sèche depuis plusieurs jours sur un problème. J'ai essayé toutes sortes de choses, j'ai recherché par-ci, par-là, toutes infos sur le sujet, mais en vain. Et donc je me tourne vers vous afin de vous soumettre mon problème. Il s'agit d'une JDialog que je crée depuis une JFrame. Ce n'est pas au niveau de la JDialog que je crée les listeners mais "en dehors". Si je ne rends pas ma JDialog modale, mes listeners sont actifs, sinon non. Or je souhaite la rendre modale. Voici mon code résumé.

    Ici, je fais l'instanciation de ma JDialog.

            // Instanciation de la JDialog.
            oDialogMvtRec=new DialogMvtRec(oFrameApplication,oInitialisation.getConnexion());
                    
            // Instanciation du contrôleur.
            ControleurDialogMvtRec oControleurDialogMvtRec=new ControleurDialogMvtRec(oFrameApplication,oDialogMvtRec,oInitialisation);
            
            // Listeners.
            oDialogMvtRec.getBtValider().addActionListener(oControleurDialogMvtRec);
            oDialogMvtRec.getBtAnnuler().addActionListener(oControleurDialogMvtRec);

    le getConnexion est ma connexion à ma base. A savoir que tout marche et que si la JDialog est static (sans donc d'instanciation) ça marche.

    Dans le code dessus, si je ne rends pas ma JDialog modale, ou si je ne le fais pas dans la classe DialogMvtRec, no problem. Mais si je rends la JDialog modale, les listeners semblent inexistants.

    Voici le bout de ma classe DialogMvtRec dans laquelle il y a l'instruction de modalité.

            this.setTitle("Rechercher les mouvements");
            this.setModal(true);
            this.setContentPane(panTop);
            this.pack();
            this.setLocationRelativeTo(null);
            this.setResizable(false);
            this.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
            this.setVisible(true);

    A savoir que faire "setModal(true" ou "setModalityType(Dialog.ModalityType.APPLICATION_MODAL)" ou super(true) ne change rien, que ce soit fait dans la classe qui "extends" JDialog, que ce soit fait après l'instanciation (code plus haut) ou que je fasse directement un new JDialog dans la classe DialogMvtRec sans faire de extend.

    Mon "controleur" ControleurDialogMvtRec est tout simple :

        @SuppressWarnings("CallToThreadDumpStack")
        public void actionPerformed(ActionEvent e) {
    
            // Bouton "Quitter".
            if(e.getSource()==oDialogMvtRec.getBtAnnuler()) {
                this.quitterDialogMvtRec();
            }
            // Bouton "Valider".
            if(e.getSource()==oDialogMvtRec.getBtValider()) {
                this.validerDialogMvtRec();
            } 
        }

    Pour exemple, this.quitterDialogMvtRec() fait juste un oDialogMvtRec.getDiag().dispose(); Bien entendu, j'ai mis des traces afin de voir si c'était le dispose qui posait problème, mais non : le listener semble inactif.

    Donc voilà, je me répète, si je rends modale la JDialog, les boutons (dont le bouton quitter) semblent inactifs. Si je ne rends pas la JDialog modale, ça marche. A noter, je me répète encore, que si j'avais fait un appel static de ma JDialog, tout marcherait (en fait je suis en train de remplacer des appels statiques par des instanciations).

    Si vous avez la solution, je suis bien entendu preneur.

    Merci à vous.

    -
    Edité par AldrikKildra 16 octobre 2018 à 6:02:09

    • Partager sur Facebook
    • Partager sur Twitter
      17 octobre 2018 à 14:52:29

      Bonjour,

      J'ai trouvé comment faire.

      Pourquoi est-ce ainsi ? Je n'ai pas la réponse, mais ce lien m'a permis d'avancer :

      https://stackoverflow.com/questions/25362284/listener-not-working-with-modal-dialog

      Donc voici mon code ; il faut juste déclencher la modalité de la JDialog et la rendre visible après l'implémentation des listeners :

            // Listeners.
              oDialogMvtRec.getBtValider().addActionListener(oControleurDialogMvtRec);
              oDialogMvtRec.getBtAnnuler().addActionListener(oControleurDialogMvtRec);
              
              // La JDialog est positionnée modal et est rendue visible. Attention, ça doit
              // se faire après la déclaration des listeners sinon ça ne marche pas.
              oDialogMvtRec.setModal(true);
              oDialogMvtRec.setVisible(true)

      J'espère aider ceux qui dans le futur auront le même problème. Par contre, à mon avis, il doit y avoir un hic dans mon code car ce problème n'aurait pas dû se poser et la solution est à mon avis une rustine.

      Je ferme le post.

      Merci de votre lecture,

      Aldrik.

      -
      Edité par AldrikKildra 17 octobre 2018 à 14:54:22

      • Partager sur Facebook
      • Partager sur Twitter

      JDialog en modal et non accessibilité des listener

      × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
      × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
      • Editeur
      • Markdown