我有一个类(模拟),它创建另一个类(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()不能是静态的,因为这似乎打破了计时器......

非常感谢任何帮助。

有帮助吗?

解决方案

this 作为参数传递给 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对象之后,Simulation类可以将自己的ActionListener添加到按钮,例如, control.getButton()。addActionListener(new ActionListener()... etc。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top