Question

J'ai un JFrame qui contient un "affichage". JPanel avec JTextField et un "contrôle". JPanel avec des boutons permettant d'accéder au contenu de l'écran JPanel . Je pense que mon problème est lié à la façon d'utiliser le modèle d'observateur, ce que je comprends en principe. Vous devez placer les écouteurs et mettre à jour les messages, mais je ne sais pas où les mettre, comment accéder d’un panneau à l’autre et éventuellement, si nécessaire, d’introduire un "modèle de données". classe. Par exemple, je souhaite accéder au contenu du JTextField à partir du panneau de configuration et utiliser un écouteur d'action anonyme de la manière suivante:

JButton openfile = new JButton("Convert file");
openfile.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent e) { 
        openButtonPressed();
    }           
});
Était-ce utile?

La solution

Vous devez réduire le couplage entre ces objets.

Vous pouvez avoir un objet maître, qui possède tous les champs de texte et le bouton (les panneaux ne sont pas pertinents)

Ensuite, un actionlistener séparé dans cet objet principal (je l'appelle médiateur, voir modèle de médiateur)

Cet écouteur d'action applique une méthode sur le médiateur, qui extrait les valeurs des champs de texte et crée éventuellement un objet de transfert.

De cette façon, vous réduisez le couplage entre les panneaux, les champs de texte, etc. et laissez le contrôle à un endroit (le médiateur), c’est-à-dire que vous ne leur faites pas se connaître.

Vous pouvez consulter le code de cette question: https://stackoverflow.com/questions/324554/#324559

Il montre ces concepts dans le code en cours d'exécution.

BTW, le modèle d'observateur est déjà implémenté dans JTextField, JButton, ActionListener, etc. Il vous suffit d'ajouter les points d'ancrage.

J'espère que cela vous aidera.

MODIFIER deux réponses en une seule.

Ceci est le code.

class App { // this is the mediator

    // GUI components.
    private JFrame frame;
    private JTextField name;
    private JTextField count;
    private JTextField date;
    // Result is displayed here.
    private JTextArea textArea;

    // Fired by this button.
    private JButton   go;

    private ActionListener actionListener;


    public App(){
        actionListener = new ActionListener(){
            public void actionPerformed( ActionEvent e ){
                okButtonPressed();
            }
        };
    }

    private void okButtonPressed(){
         // template is an object irrelevant to this code.
         template.setData( getData() );
         textArea.setText( template.getTransformedData() );
    }


    public void initialize(){

        frame     = new JFrame("Code challenge v0.1");
        frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );

        name     = new JTextField();
        count    = new JTextField();
        date     = new JTextField();
        textArea = new JTextArea();
        go       = new JButton("Go");
        go.addActionListener( actionListener ); // prepare the button.

        layoutComponents(); // a lot of panels are created here. Irrelevant.
    }
}

Le code complet et actif peut être récupéré ici:

.

Il est important de privilégier la composition par rapport à l'héritage lorsque cela est possible.

Autres conseils

Cela rend le code plus propre si vous créez les modèles dans un calque et ajoutez un ou deux calques ci-dessus pour créer les composants et la présentation. Évidemment, ne prolongez pas les goûts de JFrame et de JPanel .

Ne ressentez pas le besoin de faire correspondre la hiérarchie de composition dans la couche de modèle à l'affichage. Ensuite, il suffit de prendre le texte du Document et d'effectuer l'opération appropriée.

D'accord, ce n'est peut-être pas si simple. Les modèles Swing sont un peu en désordre. ButtonModel est en particulier endommagé au cerveau et la zone de code du contrôleur peut ne pas être entièrement pure.

Nous avons ce que l'on appelle des constructeurs, qui construiront le panneau parent à partir des enfants. Dans ce constructeur, vous aurez accès à tous les sous-composants que vous devez écouter et pouvez ainsi implémenter n'importe quelle logique.

Enfin, le générateur renvoie ensuite le panneau parent avec la logique complète.

Une fois que vous avez le panneau parent, c’est vraiment un bazar que d’obtenir les composants enfants et qu’ils fassent n'importe quoi.

merci J'ai ajouté une couche datamodel qui gère en quelque sorte la communication entre les panneaux.

J'ai aussi trouvé ce lien sur Listeners sur JTextField utile:

texte du lien

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top