2010-03-09 3 views
2

J'ai une classe principale dans un programme qui lance une autre classe qui gère toutes les choses de l'interface graphique. Dans l'interface graphique, j'ai un bouton que je dois attacher un ActionListener à.Java Simple ActionListener Questions

Le seul problème est que le code à exécuter doit résider dans la classe principale.

Comment puis-je obtenir la méthode ActionPerformed() à exécuter dans la classe principale lorsqu'un bouton est cliqué ailleurs?

Répondre

2

Faites votre commande (classe « principale ») mettre en œuvre l'interface ActionListener, puis passer une référence à la classe de vue:

public class View extends JFrame { 
    public View(final ActionListener listener) { 
    JButton button = new JButton("click me"); 
    button.addActionListener(listener); 
    button.setActionCommand("do_stuff"); 

    getContentPane().add(button); 

    pack(); 
    setVisible(true); 
    } 
} 

public class Control implements ActionListener { 

    public Control() { 
    new View(this); 
    } 

    @Override 
    public void actionPerformed(ActionEvent e) { 
    if (e.getActionCommand().equals("do_stuff")) { 
    // respond to button click 
    } 
    } 
} 

Il peut également être fait avec Actions, mais qui est plus utile lorsque vous voulez un morceau de code pour répondre à de nombreux boutons.

+0

le seul problème semble maintenant être que je passe la classe «contrôle» à travers. cependant, c'est la classe qui contient ma méthode principale et qui provient donc d'un contexte statique, ce que la classe 'view' n'est pas. une idée de comment y remédier? – Allen

+0

La solution la plus simple consiste à instancier votre classe de contrôle à partir de la méthode principale. Dans mon exemple, ce serait une méthode principale avec une ligne: new Control(); – tom

+0

J'ai déjà la majorité de la logique du programme dans la méthode principale. Êtes-vous en train de dire que je dois restructurer l'ensemble du programme pour y répondre? Tout le but était d'obtenir le code ActionPerformed dans la classe principale. Y a-t-il un moyen plus simple? – Allen

0

Implémentez ActionListener dans votre classe principale et ajoutez l'instance de classe principale en tant qu'auditeur sur votre bouton GUI.

+0

quelle forme l'instance prend-elle dans la classe principale? est-ce une classe à part? – Allen

2

Implémentez une classe interne anonyme en tant que ActionListener sur le bouton, puis appelez la méthode sur votre classe principale. Cela crée moins de dépendances et évite la balise & de programmation de style de commutation que l'implémentation de l'interface ActionListener sur une classe principale a tendance à promouvoir.

Dans les deux cas, il créera un cycle dans votre graphe de dépendance: la classe principale connaîtra le bouton et le bouton devra appeler la classe principale. Ce n'est peut-être pas une bonne idée car cela rendra difficile la composition des choses d'une autre manière. Mais sans plus d'informations, il est difficile de juger la situation ou de recommander quelque chose de concret.

+0

la classe principale lance l'interface graphique, et je peux donner l'accès aux boutons si nécessaire. le code ActionPerformed doit être dans la classe principale. Je ne sais pas ce qui doit aller où – Allen