Java structure de programmation Swing: sont les auditeurs censé être la source de presque tous les composants Swing?

StackOverflow https://stackoverflow.com/questions/3521143

Question

Ma question se résume à ceci: est-il structure standard dans la programmation Swing pour donner aux auditeurs le contrôle de nouveaux composants (par exemple une nouvelle JPanel) pour l'affichage et l'entrée, et de donner cette nouvelle auditeurs de composants de contrôle des composants sur de nouvelles pour l'affichage et l'entrée et ainsi de suite à l'infini? Ou est-Java nécessaire de revenir à une sorte de classe unifiant qui lie tous les composants Swing dans un ordre procédural?

À l'heure actuelle, dans mon application qui utilise un JFrame que, dans mes auditeurs, mon premier objet JFrame est passé en paramètre à tous mes JPanels de sorte que leurs auditeurs peuvent appeler RemoveAll () pour effacer le cadre d'un nouveau JPanel. Par exemple, le code court comme suit

public class MainFrame {
  JFrame jfrm;
  public MainFrame() {
    jfrm = new JFrame("Main Frame");
    JPanel mainPanel = new MainPanel(jfrm);
  }
}

public class MainPanel extends JPanel {
  public MainPanel(final JFrame mainFrame) {
    JButton example = new JButton("Example");
    example.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent le) {
            mainFrame.removeall();
            JPanel 2ndPanel = new 2ndPanel(mainFrame);
            mainFrame.add(2ndPanel);
            mainFrame.validate();
        }
    });
  }
}

Est-ce la bonne structure - où ce sont les auditeurs qui génèrent les nouveaux panneaux et pas une classe d'unification? Mais si tel est le cas, comment le compilateur de Java jamais à mainFrame.validate () s'il y a une infinité en cascade des auditeurs? Je suis un programmeur vieille école procédurale essayant de programmer une application Swing en Java, et je crois que je ne pourrais pas avoir compris les concepts de base de la programmation Swing. Réjouissez-vous des réponses utiles et merci à l'avance!

Était-ce utile?

La solution

Je ne le ferais pas comme ça. modèle Observateur est utilisé Swing pour envoyer des notifications, généralement à la suite d'une action de l'utilisateur.

Prenez votre exemple: l'utilisateur clique « » sur le bouton parce qu'il veut un nouveau panneau dans MainFrame. Mais le bouton ne sait pas quoi faire avec un clic. Tout ce qu'il peut faire est notify écouteurs d'événements , qu'il a été sélectionné.

Nous avons donc besoin d'une composante qui est intéressé par les notifications. Ce composant peut enregistrer un écouteur avec le bouton et recevoir des notifications. L'auditeur est cette autre de l'oreille »des composants (ou il est « œil »). Mais une oreille (ou oeil) ne prendra aucune mesure. Il est juste les autres composants du capteur.

Ce qui nous ramène à la question principale: qui veut être informé, si le bouton est cliqué et qui doit prendre des mesures. Ceci est une question de conception majeur. Il est definitly pas l'auditeur qui crée et ajoute un panneau au châssis principal. Il pourrait être le rôle principal de cadres pour créer et ajouter des panneaux de sous ou le rôle d'un troisième élément, qui est responsable de la création d'un cadre avec des panneaux de sous.

Mais le listner est un mauvais endroit pour ce code.

Autres conseils

Au lieu de détruire et de créer des panneaux que vous pourriez vouloir regarder cacher / les montrer. Il est un gestionnaire de mise en page CardLayout qui peut le faire: http : //journals.ecs.soton.ac.uk/java/tutorial/ui/layout/card.html

Fondamentalement, l'idée est de construire et d'ajouter tous vos panneaux au début de votre prog, puis utilisez le gestionnaire de mise en page pour basculer entre les vues.

Comme dit par d'autres, vous pouvez ajouter une sorte de modèle à votre conception, qui est responsable du maintien de l'état du système.

Tout d'abord, vous ne devriez pas laisser l'auditeur manipuler le cadre directement, utilisez un JPanel imbriquée ou il est ContentPane.

Votre question dépend de l'endroit où se trouve votre auditeur. Vous ne devez ajouter des composants à un JFrame de la classe elle-même. Dans votre cas, il est OK, car la logique est limitée à la classe elle-même.

Je ne pense pas qu'il y ait une infinité d'auditeurs. Ils sont dans une liste et sont exécutées séquentiellement. Votre auditeur doit utiliser SwingUtilities.invokeLater pour manipuler le cadre principal.

Je trouve l'adoption de la JFrame comme argument un peu redondant. Pourquoi ne pas créer l'auditeur à l'extérieur du constructeur?

 final JPanel mainPanel = new MainPanel();     
 JButton example = new JButton("Example");
 example.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent le) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
               MainFrame.this.removeAll();
               MainFrame.this.add(mainPanel);
            }
         });;
    }
 });
 add(example);

Il est pas le meilleur des exemples, mais je suis sûr de ce que vous note essayez de le faire.

L'essentiel est que vous devez créer les composants à l'extérieur l'auditeur, puis ajoutez à l'aide de l'auditeur.

Il y a une certaine confusion par le, pas rare, comme vous avez organisé votre code. En règle générale de Java, ne sous-classe pas où vous avez aucune raison de. Il est rarement le sens de la sous-classe JPanel ou JFrame.

Il a également fait rarement judicieux de composants affecter à des champs dans la classe qui les crée. En fait, faire moins dans les constructeurs.

faire aussi moins dans les classes internes anonymes. Detangle l'intégralité des données d'événement et appeler une méthode qui est logique pour la classe de fermeture d'avoir comme une opération.

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