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

Java 在一个类中使用ActionListener启动另一个类中的计时器,java,swing,class,timer,actionlistener,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;

我有一个类(模拟),它创建另一个类(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();”的错误:

无法从类型模拟对非静态方法StartTimer()进行静态引用

但是方法StartTimer()不能是静态的,因为这似乎会中断计时器


非常感谢您的帮助。

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

一般来说,最好避免这种循环引用。
GUI
Simulator
彼此依赖。解决方案的本质是将GUI与有趣的特定于领域的行为分离开来

(顺便说一句:我强烈避免对常量以外的任何对象使用静态变量。也避免使用非私有实例变量。但不要扩展
JFrame
!)

您应该添加一些可怕的样板文件来防止多线程

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

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

一般来说,最好避免这种循环引用。
GUI
Simulator
彼此依赖。解决方案的本质是将GUI与有趣的特定于领域的行为分离开来

(顺便说一句:我强烈避免对常量以外的任何对象使用静态变量。也避免使用非私有实例变量。但不要扩展
JFrame
!)

您应该添加一些可怕的样板文件来防止多线程

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

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

actionPerformed是如何获得sim的?抱歉,我无意中错误地发布了代码的f部分,actionPerformed现在显示为:Simulation.StartTimer();actionPerformed是如何得到sim的?抱歉,我无意中错误地发布了代码的f部分,actionPerformed现在显示为:Simulation.StartTimer();抱歉,我在发布的代码中犯了一个错误。“主构造函数”实际上是一个“Simulation”讲师。因为这样的sim本身就是一个“Simulation”对象,所以它不可能是GUI构造函数的参数我不认为…我道歉,我在我发布的代码中犯了一个错误。“主构造函数”实际上是一个“模拟”讲师。因为这样的sim本身就是一个“模拟”对象,所以它不可能是GUI构造函数的参数我不认为。。。