在一个类中使用ActionListener在另一个类中启动计时器

时间:2009-09-13 15:33:24

标签: java swing class timer actionlistener

我有一个类(模拟),它创建另一个类(GUI)的实例。在类GUI中,有一个按钮(start),它附有一个actionlistener。

我需要这个actionlistener在模拟中启动一个计时器,但我无法弄清楚如何去做。

类模拟中的代码:

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!");   
}

类GUI中的代码:

        panel1.add(button1a);

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

Eclipse告诉我的错误是“Simulation.timer.start();” :

无法对Simulation类型中的非静态方法StartTimer()进行静态引用。

然而,方法StartTimer()不能是静态的,因为这似乎打破了计时器......

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:0)

this作为参数传递给GUI构造函数。

一般来说,最好避免这种循环引用。 GUISimulator都相互依赖。该解决方案的本质是将GUI与有趣的特定于域的行为分开。

(顺便说一句:我会强烈避免将静态变量用于除常量之外的其他任何东西。还要避免使用非私有实例变量。但请注意不要扩展JFrame!)

你应该添加一些可怕的样板来防止多线程。

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

答案 1 :(得分:0)

我要做的是让你的GUI类通过getButton()方法公开按钮,然后在创建GUI对象之后,Simulation类可以将自己的ActionListener添加到按钮,例如, control.getButton()。addActionListener(new ActionListener()... etc。