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

Agents de placement/Fenêtres Java Discussion :

Ajout de Listeners sur JDialog modal


Sujet :

Agents de placement/Fenêtres Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2009
    Messages : 31
    Par défaut Ajout de Listeners sur JDialog modal
    Bonjour,

    Dans le cadre d'un projet, je dois développer une application en Java. Mon application (une JFrame) contient des menus qui ouvrent des JDialogs. Essayant de respecter le modèle MVC, voici ce que j'ai:

    - Une classe (CustomDialog) dérivant de JDialog.
    - Une classe modèle (peu importe).
    - Un contrôleur prenant comme paramètre un CustomDialog et un modèle.

    Mon problème:
    Dans la classe de CustomDialog, je fait un "setModality(true)" pour figé ma JFrame. Le problème c'est que je passe l'objet CustomDialog a mon contrôleur qui ajoute des listeners sur des composants (JButton par exemple) du CustomDialog. Seulement voilà, si mon CustomDialog est modal, aucun listener ne fonctionne, et avec modal a "false", les listeners fonctionnent. Idem si je fait un "setTitle()": depuis mon contrôleur sur mon CustomDialog modal, le titre ne change pas tandis qu'en non-modal, le titre change.

    Quel est le problème?

    Mon but est de faire un simple menu. Quand l'utilisateur clique sur un menu, une nouvelle fenêtre s'instancie et la JFrame de base devient inaccessible. La nouvelle fenêtre contient des boutons liés par des listeners au modèle.

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    299
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 299
    Par défaut
    Le titre change de ce cas :
    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
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
     
    import javax.swing.JButton;
    import javax.swing.JDialog;
    import javax.swing.JFrame;
     
    @SuppressWarnings("serial")
    public class Test extends JFrame implements ActionListener {
    	public Test() {
    		JButton jb_open_dial = new JButton("Open Dialog");
    		jb_open_dial.setActionCommand("open");
    		jb_open_dial.addActionListener(this);
     
    		add(jb_open_dial);
     
    		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);		
    		setTitle("0");
    		setSize(200, 200);
    		setLocationRelativeTo(null);
    	}
     
    	public void actionPerformed(ActionEvent e) {
    		if(e.getActionCommand().equals("open")){
    			MyDialog dial = new MyDialog(this);
    			dial.setModal(true);
    			dial.setVisible(true);
    		}
    		if(e.getActionCommand().equals("change_name")){
    			setTitle((Integer.parseInt(getTitle())+1) + "");
    		}
    	}
     
    	public static void main(String... args) {
    		new Test().setVisible(true);
    	}
    }
     
    @SuppressWarnings("serial")
    class MyDialog extends JDialog{
    	public MyDialog(JFrame parent) {
    		super(parent);
     
    		JButton jb_change_parent_title = new JButton("Change Parent Name");
    		jb_change_parent_title.setActionCommand("change_name");
    		jb_change_parent_title.addActionListener((ActionListener)parent);
     
    		add(jb_change_parent_title);
     
    		pack();
    	}
     
    }

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2009
    Messages : 31
    Par défaut
    Non, ce n'est pas mon but de faire ça. Voici le code que j'aimerais faire en plus simple:

    - Une JFrame avec un bouton. Lorsque l'on clique dessus, une JDialog s'ouvre.
    - Le constructeur de la JDialog fixe la taille, la modalité et la visibilité.

    Le problème c'est que dans ma JFrame, après avoir créer une JDialog, je tente de changer le titre "dial.setTitle("Après");" mais il ne change pas.

    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
     
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
     
    import javax.swing.JButton;
    import javax.swing.JDialog;
    import javax.swing.JFrame;
     
    @SuppressWarnings("serial") public class Test extends JFrame implements ActionListener
    	{
     
    	public Test()
    		{
    		JButton jb_open_dial = new JButton("Open Dialog");
    		jb_open_dial.setActionCommand("open");
    		jb_open_dial.addActionListener(this);
     
    		add(jb_open_dial);
     
    		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		setTitle("0");
    		setSize(200, 200);
    		setLocationRelativeTo(null);
    		}
     
    	public void actionPerformed(ActionEvent e)
    		{
    		MyDialog dial = new MyDialog(this);
    		dial.setTitle("Après"); // Ici je tente de changer le titre.
    		}
    	}
     
    @SuppressWarnings("serial") class MyDialog extends JDialog
    	{
     
    	public MyDialog(JFrame parent)
    		{
    		super(parent);
     
    		setProprietes();
    		}
     
    	private void setProprietes()
    		{
    		setTitle("Avant");
    		setSize(200, 200);
    		setModal(true);
    		setVisible(true);
    		}
    	}
    Par contre, si j'enlève le "setModal(true)" et "setVisible(true)" de la classe JDialog et que je les fait après le "dial.setTitle("Après")" de la classe JFrame comme ceci:

    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
     
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
     
    import javax.swing.JButton;
    import javax.swing.JDialog;
    import javax.swing.JFrame;
     
    @SuppressWarnings("serial") public class Test extends JFrame implements ActionListener
    	{
     
    	public Test()
    		{
    		JButton jb_open_dial = new JButton("Open Dialog");
    		jb_open_dial.setActionCommand("open");
    		jb_open_dial.addActionListener(this);
     
    		add(jb_open_dial);
     
    		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		setTitle("0");
    		setSize(200, 200);
    		setLocationRelativeTo(null);
    		}
     
    	public void actionPerformed(ActionEvent e)
    		{
    		MyDialog dial = new MyDialog(this);
    		dial.setTitle("Après");
    		dial.setModal(true);
    		dial.setVisible(true);
    		}
    	}
     
    @SuppressWarnings("serial") class MyDialog extends JDialog
    	{
     
    	public MyDialog(JFrame parent)
    		{
    		super(parent);
     
    		setProprietes();
    		}
     
    	private void setProprietes()
    		{
    		setTitle("Avant");
    		setSize(200, 200);
    		}
    	}
    La ça fonctionne mais je "perd" en clarté. J'aimerais que toute la "configuration" de la JDialog se fasse dans SA classe y compris setModal et setVisible.

    Donc la question ce serait de savoir comme effectuer des actions (ajout de listener, changement de titre,...) sur une JDialog modale?

    Apparemment le modale fige tout le reste à par la fenêtre concerné. Moi j'aimerais que ce soit figé tout en acceptant des actions venant d'autres classes.

    Merci beaucoup !

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    299
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 299
    Par défaut
    Citation Envoyé par gagou7 Voir le message
    Apparemment le modale fige tout le reste à par la fenêtre concerné.
    C'est justement le but du modal... Si tu mets en System.out.println("blabla"); dans ton listener, tu verras qu'il s'exécute à la fermeture de ta fenêtre modale. C'est le principe des JOptionPane.showXxxxxx().

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Décembre 2009
    Messages : 31
    Par défaut
    Ah d'accord... Mais alors comment faire pour ne pas être en modal et en même temps empêcher d'accéder graphiquement à la fenêtre principal pendant qu'une JDialog est ouverte?


    Merci.

  6. #6
    Membre émérite Avatar de fraco
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2006
    Messages : 750
    Par défaut
    On peut connaître les coordonnées d'un clic :

    getRootPane().getGlassPane().addMouseListener(new java.awt.event.MouseAdapter() {
    .....public void mousePressed(java.awt.event.MouseEvent evt) {
    ..........JOptionPane.showMessageDialog(null, evt.getX()+" "+evt.getY());
    ...}
    });
    après, tu regardes si ce point est à l'intérieur du dialog, sinon ...annuler le clic;
    (mais est-ce possible ?)
    pas testé, à voir

  7. #7
    Membre chevronné
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    299
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 299
    Par défaut
    Quel type de code veux tu exécuter, hors de ta fenêtre modale, mais après son ouverture ?

    Tu vas avoir différentes possibilités en fonction de la réponse.
    Utiliser un Thread, déclencher le code depuis ta fenêtre modal, ... ...

Discussions similaires

  1. Ajouter des Listener sur des objets créés dynamiquement
    Par floctc dans le forum Composants
    Réponses: 10
    Dernier message: 23/04/2010, 16h35
  2. Comment ajouter un listener sur une combobox ?
    Par piero53 dans le forum Débuter
    Réponses: 5
    Dernier message: 18/04/2010, 21h18
  3. Comment ajouter un Listener sur uun object quelconque?
    Par LDPDC dans le forum Général Java
    Réponses: 7
    Dernier message: 27/04/2009, 17h51
  4. JSP: ajouter un listener sur un TreeNode
    Par hurric dans le forum Servlets/JSP
    Réponses: 1
    Dernier message: 09/07/2008, 14h57
  5. Ajouter un listener sur une variable
    Par serwol dans le forum Général Java
    Réponses: 4
    Dernier message: 14/10/2005, 15h39

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