Pergunta

Eu tenho uma classe (simulação), que cria uma instância de outra classe (GUI). Dentro do GUI classe há um botão (start), que tem um ActionListener ligado a ele.

Eu preciso deste ActionListener para iniciar um temporizador na simulação, mas eu não consigo descobrir como fazê-lo.

Código de Classe Simulação:

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 na classe GUI:

        panel1.add(button1a);

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

O erro Eclipse me diz que há, é que para "Simulation.timer.start ();" :

Não é possível fazer uma referência estática para o método não-estático startTimer () a partir do tipo de simulação.

No entanto, o método startTimer () não pode ser estático como este parece quebrar o temporizador ...

Qualquer ajuda seria muito apreciada.

Foi útil?

Solução

Passe this como um argumento para o construtor GUI.

Em geral, é melhor evitar tais referências cíclicas. Tanto o GUI e Simulator se tornar dependentes uns dos outros. A essência da solução é separar a GUI do comportamento interessante de domínio específico.

(BTW:..! Eu fortemente evitar o uso de variáveis ??estáticas para outra coisa senão constantes Também evite não-privados variáveis ??de instância Mas do ponto para não estender JFrame)

Há algum clichê horrível que você deve adicionar para evitar multithreading.

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

Outras dicas

O que gostaria de fazer é ter sua classe GUI expor o botão através de um método getButton (), em seguida, depois de criar o objeto GUI, sua classe Simulação pode adicionar seu próprio ActionListener ao botão, por exemplo, control.getButton (). addActionListener (novo ActionListener () ... etc.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top