我知道应该使用 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);
}
但是,当我运行此代码时,我只看到菜单窗口。当我退出菜单并显示模拟窗口时 - 程序似乎已关闭。
有什么想法我在这里做错了吗?