【发布时间】:2014-03-31 13:29:21
【问题描述】:
我了解应该使用 invokeLater 在事件调度线程 (EDT) 上安全地创建 JFrame,并且我正在尝试在我的 main 方法中创建其中两个。
代码:
public void run() {
// Handle Menu When Open
menu.setVisible(true);
while(menu.isVisible())
{
if(menu.isShowing() == false) {
showMenu = false;
showSimulation = true;
}
}
menu.setVisible(false);
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
int[] dims = menu.SizeSetting();
simulation = new Simulation(dims[0], dims[1]);
}
});
simulation.run();
}
因此,菜单已创建(这似乎工作正常,因为此处所需的处理非常少)。在此之后,使用菜单,在menu.setVisible(false) 处单击一个按钮被调用。之后,我在 EDT 上排队了一个方法,Simulation 是一个派生自JFrame 的类。它的构造函数如下:
public Simulation(int width, int height) {
this.setVisible(false);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setTitle("Traffic Light System - Simulation");
grid = new Grid(0, 0);
ready = false;
grid = new Grid(width, height);
addComponentsToPane(); // Set up visualization of grid here
// Introduce cars here? e.g. grid.Get(0, 0).addCars(new Car[])?
ready = true;
setVisible(true);
}
addComponentsToPane() 方法将所有必需的内容添加到 JFrame。在这个构造函数之后调用的 run() 方法很简单:
public void Run() {
while(isVisible()) {
OneStep();
}
setVisible(false);
}
但是,当我运行此代码时,我只看到菜单窗口。当我退出菜单并显示模拟窗口时 - 程序似乎已关闭。
有什么想法我在这里做错了吗?
【问题讨论】:
-
在
Run()主方法中,simulation变量也存在竞争条件。如果您调用invokeLater(),则该代码可能在调用simulation.Run()方法后运行良好。结果将是不确定的。也许正确的做法是使用invokeAndWait()而不是invokeLater(),但正如 Hovercraft 所指出的那样,这很难知道。
标签: java swing jframe event-dispatch-thread invokelater