JFrames は、invokeLater を使用してイベント ディスパッチ スレッド (EDT) で安全に作成する必要があることを理解しています。メイン メソッド内で JFrames を 2 つ作成しようとしています。
コード:
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);
}
ただし、このコードを実行すると、メニュー ウィンドウしか表示されません。メニューを終了し、シミュレーション ウィンドウが表示されたときに、プログラムが終了したように見えます。
ここで私が間違っていることはありますか?