これは、FrameA にその構築プロセスを終了させていないためです。それを中断してから、同じスレッドで他の 2 つのフレームを表示しています。
戦略を変更して、ファクトリ メソッドを使用し、おそらく SwingUtilities.invokeLater メソッドと組み合わせて使用することをお勧めします。
次のようなものがあるとしましょう:
public static void main( String [] args ) {
JFrame a = new FrameA(); // Has both display logic and trial "pop up" logic
}
次のように変更します。
public static void main( String [] args ) {
JKFrame a = FrameA.createFrame(); // the same but splited like the following code
}
class FrameA extends JFrame {
// new method
public static JFrame createFrame() {
return new FrameA();
}
}
ファクトリメソッドを追加しただけで何も変わっていません。後で次のことができます。
public static JFrame createFrame() {
if( thatSpecialLogicSaysItIsTrialAndShouldPopUp() ) {
JFrame b = new FrameB();
b.setVisible( true );
JFrame c = new FrameC();
c.setVisible( true );
return new FrameA();
} else {
return new FrameA();
}
}
2 番目のコードで行うことは、ロジックをクラス コンストラクターから分離し、それをファクトリ メソッドに配置することです。そうすれば、そのSpecialLogicSaysItIsTrialAndShouldPopUpがtrueを返す場合、BとCを表示します
説明どおりに JDialog を使用することもできますが、責任を分離するとほとんど問題がなくなります。