2010-08-22 23 views
4

Je voudrais utiliser des classes et des méthodes d'usine pour générer des composants GUI, mais je ne sais pas comment et dans quelle classe les différents écouteurs doivent être déclarés et ajoutés aux composants.Utilisation de classes de fabrique statiques pour générer des composants GUI - Comment et où ajouter les écouteurs requis?

Si j'ai une classe de fabrique simple telle que celle listée ci-dessous, devrais-je ajouter un ActionListener au bouton avant qu'il ne soit retourné à la classe appelante. Si la réponse est "Oui" alors comment ajouter l'auditeur?

class GUIFactory 
{ 
    public static JButton getJButton() 
    { 
     JButton aButton = new JButton(); 
     return aButton; 
    } 
} 

Supposons que je voulais utiliser la méthode getJButton() pour ajouter 5 boutons à l'interface graphique, comment pourrais-je coder le ActionListener pour qu'il sache quel bouton a été cliqué?

Ou faut-il ajouter les écouteurs dans la classe appelante?

JFrame gui = new JFrame(); 
gui.add(AppFactory.getJButton()); 

J'ai essayé le

gui.add(GUIFactory.getJButton().addActionListener(new guiButtonListener())); 

et après eu une erreur:

"void" type not allowed here.

+0

Quelle est votre intention d'utiliser une usine? Mais si vous voulez utiliser l'usine, vous devriez envisager de rendre les classes les plus courantes comme 'AbstractButton' de la méthode pour être plus flexible si vous changez vraiment le composant retourné. –

+0

De même, si vous souhaitez créer un chaînage de méthode de mise en valeur des composants, vous pouvez envisager le * Builder Pattern *. –

+1

Bonjour Johannes. Mon but était de créer une interface graphique basée sur JFrame modulaire pour mon application. Dans le passé, mes interfaces graphiques étaient toujours construites en une seule classe et je voulais m'éloigner de cela pour une façon plus ré-utilisable de faire les choses. Pour être honnête avec vous, je n'ai aucune expérience de la mise en œuvre de modèles, d'usines, etc. - en fait, le premier que je connaissais était sur SO lorsque je lisais des questions relatives à java. Les échantillons de code que j'ai publiés ont été ma première tentative basée sur les échantillons d'autres personnes postés ici sur SO. Merci pour la suggestion Builder Pattern. –

Répondre

5

C'est parce que addActionListener retourne void. Essayez:

JButton button = GUIFactory.getJButton(); 
button.addActionListener(new guiButtonListener()) 
gui.add(button); 

Soyez conscient que la programmation GUI Swing est tout à fait idiomatiques. Certains peuvent préférer utiliser Beans Binding (ou une autre solution de liaison) pour connecter les vues et les modèles entre eux. On pourrait argumenter que l'utilisation d'un Event Bus donne les meilleurs, les composants GUI faiblement couplés, hautement réutilisables. Jetez un oeil également à the Swing Application Framework (maintenant obsolète, mais le BSAF pour est en très bon état) et GUTS cadre.

Vous verrez qu'il existe de nombreuses tentatives pour résoudre les problèmes de programmation et de conception de l'interface graphique. Le sujet est très large et les solutions varient énormément. Oh, et les deux grandes plates-formes de contenu Swing Rich (NetBeans RCP, Eclipse RCP) ont des API très spécifiques pour gérer les interfaces graphiques. À titre d'exemple, NetBeans RCP utilise les API Lookup, Nodes et Windows pour protéger le développeur des problèmes Swing. L'équipe Eclipse a abandonné Swing et a écrit sa propre boîte à outils SWT GUI. Vous pourriez vouloir regarder des tutoriels si vous aviez voulu quelques bonnes références de conception.

+0

Eclipse RCP n'est pas basé sur Swing! –

+0

Salut, Rekin. Merci pour la réponse - J'aurais pu me donner un coup de pied quand j'ai vu votre exemple de code :-) Je n'ai aucune expérience de l'utilisation des usines alors j'essayais juste ma main basée sur d'autres exemples de code que je lirais ici. –