2011-06-07 1 views
1

Je ne parviens pas à contourner celui-ci. J'ai essayé d'adhérer au modèle MVC pour la première fois et j'ai maintenant des difficultés à accéder à la source d'un ActionEvent car l'ActionListener est situé dans une classe différente. Mais que le code faire parler ...Comment accéder à la source d'un ActionEvent lorsque l'ActionListener se trouve dans une classe différente?

Dans la "vue":

// ControlForms.java 

... 

private JPanel createSearchPanel() throws SQLException { 

... 

comboBoxCode = new JComboBox(); // Field comboBoxCode -> JComboBox() 
    SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      AutoCompleteSupport<Object> support = AutoCompleteSupport.install(
comboBoxCode, GlazedLists.eventListOf(jnlCodeArray)); 
     } 
    }); // Auto-Complete comboBox from GlazedLists 

... 

public void setComboListener(ComboListener comboListener) { 
    comboBoxCode.addActionListener(comboListener); 
} 

... 

} 

Puis, à ce que j'appelle le contrôleur, j'ai deux classes différentes:

// Controller.java 

    public MyController() throws SQLException { 
... 
    addListeners(); 
} 

... 

    private void addListeners(){ 
    View view = getView(); 
    getView().getControlForm().setComboListener(new ComboListener()); 

} 

et

public class ComboListener implements ActionListener { 
public void actionPerformed(ActionEvent e) { 
    System.out.println("ComboBox listened to! e = " + e.toString()); 
} 
} 

maintenant, évidemment e ne donne pas le nom de la variable (qui, au moment Je souhaite qu'il serait), donc je ne peux pas if test pour e.getSource().

Ma question est donc: est-il soita) un moyen d'interroger (via if par exemple) la source d'e ou b) une façon moins compliquée à obtenir au nom de la variable?

Merci beaucoup d'avance pour vos idées et conseils!

Répondre

3

Pourquoi avez-vous besoin du nom de la variable? Pourquoi ne pouvez-vous faire la gestion des événements comme celui-ci

public class ComboListener implements ActionListener 
{ 
    public void actionPerformed(ActionEvent e) 
    { 
     JComboBox source = (JComboBox)e.getSource(); 

     //do processing here 
    } 
} 

Je pense que si vous devez faire le traitement selon le nom de la variable, évidemment, vous avez besoin de différents auditeurs pour différentes zones de liste déroulante.

+0

Merci. Je suis nouveau à MVC, alors j'essayais de faire les choses à l'ancienne. Bien sûr, vous avez raison d'avoir besoin d'un écouteur par 'JComboBox'. Est-ce * bonne pratique de codage * d'avoir un écouteur par, disons, élément de forme? –

+1

D'une manière générale, il est préférable de séparer chaque comportement de manipulation d'événement dans une classe séparée (quoique interne). Par conséquent, si la façon dont vous gérez les événements sur deux JComboBox différents est différente, placez-les dans des classes différentes. D'un autre côté, si vous avez deux zones de liste déroulante qui se complètent automatiquement, essayez d'effectuer la gestion dans la même classe. –

+0

Merci encore pour la clarification! –

0

Généralement, il y a seulement deux situations dans lesquelles vous devriez utiliser un écouteur comme ça: a) vous allez gérer un certain événement de la même façon pour un tas d'objets, ou b) vous êtes seulement va utiliser l'écouteur pour un objet. Dans ce dernier cas, je préférerais gérer l'événement localement de toute façon. Cela dit, la réponse directe à votre question est la suivante: vous ne devriez pas avoir à vérifier à l'intérieur de votre implémentation ActionListener pour voir si l'objet approprié est la source de l'événement; vous devriez simplement ajouter le ActionListener à cet objet. Une note finale: sans connaître les spécificités de votre architecture ... en général, MVC traitera toutes les manipulations événementielles dans le cadre de la vue (il réduit le couplage) et la vue passera des commandes ou des appels de méthode ou vos propres événements (c'est-à-dire, pas de Swing) au contrôleur.

+0

Pour ajouter brièvement à cela: à partir d'une perspective POO, les instructions 'if' indiquent généralement que votre conception pourrait être meilleure. –

Questions connexes