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

AWT/Swing Java Discussion :

Créer un listener personnalisé


Sujet :

AWT/Swing Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 78
    Par défaut Créer un listener personnalisé
    Bonjour,
    J'ai une interface swing conçue de la façon suivante :
    - JDesktopPane : la fenêtre de l'application
    - JInternalFrame : des fenêtres internes dans l'application
    - JinternalFrame : une fenêtre interne (type popup) ouverte par la précédente (via un jbutton) et qui, quand elle est fermée (via un jbutton), doit lancer une méthode la fenêtre appelante. Cela ressemble effectivement à un comportement de type JDialog mais je ne passe pas par un JDialog car ce type de fenêtre ne me permet pas de faire des trucs qui sont indispensables. Par contre il me manque la communication retour de la fenêtre appelée vers la fenêtre appelante (je veux retourner une donnée de type complexe (une instance de classe applicative, par juste un Integer ou un string).
    Le problème est que la fenêtre appelante ouvre bien la fenêtre "popup" mais comme ce n'est pas une fenêtre JDialog, elle n'attend pas que la fenêtre appelée soit fermée pour reprendre la main et continuer son traitement.
    Pour que ma fenêtre popup puisse envoyer son résultat, je ne vois donc comme moyen que de passer par un listener personnalisé :
    - ma fenêtre appelante a un listener qui quand il est activer lance une méthode interne getResultatPopup(Resultat res)
    - ma fenêtre popup s'abonne à ce listener et quand l'utilisateur clique sur le bouton de fermeture de la fenêtre, cela ferme la fenêtre (dispose()) mais fait un "fire" pour activer le listener.

    Enfin voilà ce que j'ai compris.
    Ma première question : Est-ce que les principes que j'ai compris sont les bons ?
    Ma deuxième question : Connaissez-vous une doc simple et intuitive qui explique comment implémenter ça en jva/swing (les tutoriaux que j'ai trouvé vont toujours dans trop d'abstrait et je suis largué au bout de 10 lignes) ?
    Ma troisième question : Y a t-il un autre moyen pour faire communiquer le résultat entre mes 2 fenêtres ?

    Merci d'avance

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

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Tout simplement de faire en sorte que le contrôleur de ta deuxième fenêtre possède une référence sur le controleur de la première fenêtre. Cette référence lui sera passée en paramètre à la construction. Et donc ta deuxième fenêtre se servira du controleur de la première pour mettre à jour les données à sa fermeture.

    (par controleur j'entend une classe possédant des méthodes permettant de modifier spécifiquement telle ou telle donnée. Cette classe peut être directement celle de tes fenêtres, même si à terme il est vrai que l'on préfère découper ça un peu plus fortement.)

    Petit exemple

    La fenêtre principale:

    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
    package swing.tests.model;
     
    import java.awt.BorderLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
     
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JTextField;
     
    public class Controleur1 {
     
        private JFrame frame;
        private JTextField textField;
        private JButton button;
        private Controleur2 control;
     
        public Controleur1() {
            control = new Controleur2(this);
            initComponents();
        }
     
     
        public void setText(String s) {
            textField.setText(s);
        }
     
        private void initComponents() {
            frame = new JFrame("Test");
            textField = new JTextField(10);
            textField.setEditable(false);
            button = new JButton("OK");
            button.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent arg0) {
                    control.showDialog();
                }
            });        
            frame.add(textField);        
            frame.add(button, BorderLayout.SOUTH);
            frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        }
     
        public void showFrame() {
            frame.pack();
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
        }
     
        public JFrame getFrame() {        
            return frame;
        }
     
        public static void main(String[] args) {
            Controleur1 cont = new Controleur1();
            cont.showFrame();
        }
    }

    La sous fenêtre

    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
    package swing.tests.model;
     
    import java.awt.BorderLayout;
    import java.awt.FlowLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
     
    import javax.swing.JButton;
    import javax.swing.JDialog;
    import javax.swing.JPanel;
    import javax.swing.JTextField;
     
    public class Controleur2 {
     
        private Controleur1 parent;
        private JDialog dialog;
        private JTextField textField;
        private JButton button;
     
     
        public Controleur2(Controleur1 controleur1) {
            this.parent = controleur1;        
        }
     
        public void showDialog() {        
            initComponents();
            dialog.pack();
            dialog.setLocationRelativeTo(parent.getFrame());
            dialog.setVisible(true);
        }
     
        private void initComponents() {
            dialog = new JDialog(parent.getFrame());
            textField = new JTextField(10);
            button = new JButton("OK");
            button.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent arg0) {
                    parent.setText(textField.getText());
                    dialog.dispose();
                }
            });
     
            dialog.add(textField);
            JPanel p = new JPanel(new FlowLayout(FlowLayout.TRAILING));
            p.add(button);
            dialog.add(p, BorderLayout.SOUTH);        
        }
    }
    Sinon pour un tutoriel sur les listeners personnalisés: http://rom.developpez.com/java-listeners/

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    187
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 187
    Par défaut
    Salut,

    A ma connaissance, ton problème peut être résolu comme ça :
    - Tu crée une classe qui extend JDialog
    - Une donnée membre de cette classe contient ta donnée à "retourner" (avec son accesseur)
    - Quand tu fais appel à ta fenêtre Dialog, tu fait tout le traitement qui permet d'initialiser ta donnée membre
    - Dans la fenêtre appelante tu fais un truc du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      maJDialogPerso.setVisible(true);
      TypeComplexe retour = maJDialogPerso.getMaDonnee();
    ça te permet d'accéder à ta donnée après la fermeture de ton dialog. J'avais déjà eu à me poser cette question et il me semble que je m'en était tiré comme ça si mes souvenirs sont bons !

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 78
    Par défaut
    Réponse à sinok
    En voyant ta solution, j'ai envie de me taper la tête contre le mur tellement elle est simple et évidente. Je teste ça ce soir mais je ne vois pas pourquoi ça ne marcherait pas. Merci à toi :-)

    Réponse à legentil
    Je ne peux pas passer par un JDialog ni par une classe dérivée pour cause de fonctionnalités que je ne peux réaliser avec un JDialog (et pourtant j'ai essayé) ou qui ne me conviennent pas.
    Sinon c'est vrai qu'avec un JDialog ça aurait été beaucoup plus simple puisque ma fenêtre principale n'aurait reçu la main qu'une fois la jdialog fermée et le retour du résultat de la jdialog aurait été facile également.
    Mais bon je ne passe pas par un jdialog ...

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    187
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 187
    Par défaut
    Au temps pour moi j'ai du lire ton post un peu vite et je pensais que ce qui t'empêchait d'utiliser le JDialog était justement le fait que tu ne savais pas faire la communication avec la fenêtre appelante

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 78
    Par défaut
    Pas de souci, tu as pris de ton temps pour me répondre et essayer de m'aider, c'est très sympa de ta part, merci :-)

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

    Informations forums :
    Inscription : Août 2004
    Messages : 8 765
    Par défaut
    Citation Envoyé par Ghorin Voir le message
    Réponse à sinok
    En voyant ta solution, j'ai envie de me taper la tête contre le mur tellement elle est simple et évidente. Je teste ça ce soir mais je ne vois pas pourquoi ça ne marcherait pas. Merci à toi :-)
    De rien, pense à appuyer sur le bouton résolu en bas de la discussion au passage .

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    78
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 78
    Par défaut
    Et bien ça y est, la solution de sinok est implémentée et marche nickel :-)

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

Discussions similaires

  1. Comment créer un menu personnalisé avec Access2007
    Par marionAccess dans le forum Access
    Réponses: 6
    Dernier message: 24/01/2007, 16h29
  2. Créer un formulaire personnalisé
    Par dddodo dans le forum IHM
    Réponses: 19
    Dernier message: 08/01/2007, 13h17
  3. Réponses: 3
    Dernier message: 20/11/2006, 09h45
  4. Réponses: 5
    Dernier message: 24/10/2006, 21h18
  5. [JSP]comment créer un listener pour ma base de données
    Par Ekimasu dans le forum Servlets/JSP
    Réponses: 14
    Dernier message: 10/05/2004, 14h49

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