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.

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top