Utilisation d'un ActionListener dans une classe pour démarrer un minuteur dans une autre classe

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

Question

J'ai une classe (simulation) qui crée une instance d'une autre classe (GUI). Dans l'interface graphique de la classe, un bouton (début) est associé à un actionlistener.

J'ai besoin de cette actionlistener pour démarrer une minuterie en simulation, mais je ne vois pas comment faire.

Code en simulation de classe:

public class Simulation{

private static JFrame frame;
private static GUI control;
public static Integer xcontrol = 100, ycontrol = 100;

public Timer timer;
public int steps;

public static void main(String[] args) {
    Simulation sim = new Simulation ();

}

public Simulation() {

frame = new JFrame("Action Listener Test");
frame.setLayout(new BorderLayout(1,0));

control = new GUI (xcontrol, ycontrol);
frame.getContentPane().add(control , BorderLayout.CENTER);

frame.setResizable(false);
frame.pack();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}


public void StartTimer() {
    timer.start();
    System.out.println("It worked!");   
}

Code dans la classe GUI:

        panel1.add(button1a);

            button1a.addActionListener(new ActionListener() {
                public void actionPerformed (ActionEvent event) {
                    Simulation.StartTimer();
                    }
                } );

L'erreur que me dit Eclipse est la suivante: "Simulation.timer.start ();" :

Impossible de faire une référence statique à la méthode non statique StartTimer () à partir du type Simulation.

Cependant, la méthode StartTimer () ne peut pas être statique car cela semble interrompre le chronomètre ...

Toute aide serait très appréciée.

Était-ce utile?

La solution

Transmettez this en tant qu'argument du constructeur GUI .

En général, il est préférable d'éviter de telles références cycliques. GUI et Simulator dépendent l'un de l'autre. L’essence de la solution consiste à séparer l’interface graphique du comportement intéressant spécifique au domaine.

(BTW: J'éviterais fortement d'utiliser des variables statiques pour autre chose que des constantes. Évitez également les variables d'instance non privées. Mais n'utilisez pas JFrame !)

Il y a un passe-partout hideux que vous devez ajouter pour empêcher le multithreading.

public static void main(final String[] args) {
    java.awt.EventQueue.invokeLater(new Runnable() { public void run() {
                Simulation sim = new Simulation();
    }});
}

Autres conseils

Ce que je ferais, c’est que votre classe GUI expose le bouton via une méthode getButton (). Ensuite, après la création de l’objet GUI, votre classe Simulation peut ajouter son propre ActionListener au bouton, par exemple. control.getButton (). addActionListener (nouvelle ActionListener () ... etc.

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