我有一个类(模拟),它创建另一个类(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()不能是静态的,因为这似乎打破了计时器......
非常感谢任何帮助。
答案 0 :(得分:0)
将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();
}});
}
答案 1 :(得分:0)
我要做的是让你的GUI类通过getButton()方法公开按钮,然后在创建GUI对象之后,Simulation类可以将自己的ActionListener添加到按钮,例如, control.getButton()。addActionListener(new ActionListener()... etc。