2009-09-13 8 views
2

J'ai une classe (simulation) qui crée une instance d'une autre classe (GUI). À l'intérieur de la classe GUI, il y a un bouton (start) auquel un actionlistener est attaché.Utilisation d'un ActionListener dans une classe pour démarrer un timer dans une autre classe

J'ai besoin de cet actionlistener pour démarrer un timer en simulation mais je n'arrive pas à comprendre comment le faire.

code dans Simulation 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 l'interface graphique de classe:

 panel1.add(button1a); 

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

L'erreur Eclipse me dit qu'il ya, est que pour "Simulation.timer.start();" :

Impossible de créer 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 comme cela semble briser la minuterie ...

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

+0

Comment le actionPerformed obtient sim – iny

+0

Désolé, je accidentellement posté une partie f code incorrect, le actionPerformed se lit maintenant: Simulation.StartTimer(); – Myles

Répondre

0

Passez le this comme argument au constructeur GUI.

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

(BTW: Je fortement éviter d'utiliser des variables statiques pour autre chose que des constantes Evitez également les variables d'instance non-privées, mais le point de ne pas étendre JFrame..!)

Il y a une boilerplate hideuse que vous devez ajouter à empêcher le multithreading.

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

Je m'excuse, j'ai fait une erreur dans le code que j'ai posté Le "constructeur principal" était en fait un instructeur "Simulation" Comme sim est lui-même un objet "Simulation", il ne peut donc pas être un argument pour le constructeur IUG. ne pense pas ... – Myles

0

Ce que je ferais est d'avoir votre classe de GUI exposer le bouton via une méthode getButton(), puis après avoir créé l'objet GUI, votre classe de simulation peut ajouter son propre ActionListener au bouton, par exemple .? Control.getButton() addActionListener (nouveau ActionListener() ... etc.

Questions connexes