Usar un ActionListener en una clase para iniciar un temporizador en otra clase
-
07-07-2019 - |
Pregunta
Tengo una clase (simulación) que crea una instancia de otra clase (GUI). Dentro de la GUI de la clase hay un botón (inicio) que tiene un actionlistener adjunto.
Necesito este escucha de acción para iniciar un temporizador en la simulación, pero no puedo entender cómo hacerlo.
Código en simulación de clase:
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!");
}
Código en la GUI de clase:
panel1.add(button1a);
button1a.addActionListener(new ActionListener() {
public void actionPerformed (ActionEvent event) {
Simulation.StartTimer();
}
} );
El error que Eclipse me dice que es, es que para "Simulation.timer.start ();" :
No se puede hacer una referencia estática al método no estático StartTimer () del tipo Simulación.
Sin embargo, el método StartTimer () no puede ser estático, ya que parece romper el temporizador ...
Cualquier ayuda sería muy apreciada.
Solución
Pase this
como argumento para el constructor GUI
.
En general, es mejor evitar tales referencias cíclicas. Tanto la GUI
como el Simulator
dependen uno del otro. La esencia de la solución es separar la GUI del interesante comportamiento específico del dominio.
(Por cierto: evitaría usar variables estáticas para cualquier cosa que no sean constantes. También evite las variables de instancia no privadas. ¡Pero apunte por no extender JFrame
!)
Hay algunas repeticiones horribles que debe agregar para evitar el subprocesamiento múltiple.
public static void main(final String[] args) {
java.awt.EventQueue.invokeLater(new Runnable() { public void run() {
Simulation sim = new Simulation();
}});
}
Otros consejos
Lo que haría es que su clase de GUI exponga el botón mediante un método getButton (), luego, después de crear el objeto de GUI, su clase de Simulación puede agregar su propio ActionListener al botón, p. control.getButton (). addActionListener (nuevo ActionListener () ... etc.