作成JFrameから別のJframeのコンストラクタ
質問
私は3つのオブジェクトの拡張 JFrame
おうし FrameA
FrameB
FrameC
.
FrameA
私の主なアプリケーションウィンドウ.から FrameA
's"のコンストラクタがある場合、アプリケーションが登録されていないかを FrameB
や FrameC
.それらは単なるポップアップを表示します。
2倍の10の応用を凍結させ、表示することはありませんのB非Cフレームとフレームな応じ.
破壊も修復もおもしろくないのインターネットサイトのフレームの作成本ストッキングがあります。
解決
これませFrameA仕上がりでを築きを中断して、同じスレッド表示方のフレームに。
私はあなたが変更戦略および利用ファクトリメソッドやろうと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();
}
}
ただこのコードは別の論理からのクラスのコンストラクタでは、工場方法です。ればそういう風になるように thatSpecialLogicSaysItIsTrialAndshouldpopup はtrueを返します表示B、C
できるものとして記載利用JDialogが、ほとんどの問題がございますのresponsabilities.
他のヒント
あなたが何かのような音がイベントスレッドをロックだ記述症状 - これは、またはあなたがフレームを起動しているかとは何があってもなくてもよいが - それは症状を示す起動時には、デバッガで実行したいとうイベントスレッドの状態を確認ます。
(私はあなたには、いくつかの他の場所にロジックを起動フレームを引くべきだとスレッド内の他のみんなと一緒に同意するだろうけど - しかし - 別のフレームのコンストラクタからフレームコンストラクタを呼び出すことについて、「安全でない」何もない - 彼らはすべてのと違いじゃないんです他のコンストラクタそれは悪いデザインかもしれ - 。。しかし、それはイベントスレッドをロックアップしてはいけません)。
あなたはJDialogのを使用するようにするつもり。この正確なことを行うために作らあります。
あなたはあなたのロジックを考える必要があります。別のフレームのコンストラクタで新しいフレームの作成は奇妙に聞こえます。あなたは、コンストラクタでそれをやっている場合 - それは、最初のフレームがまだ示されていないことを意味します。なぜあなたは、コンストラクタフレームの外にBとCをフレーム表示しない - 論理的には同じであると思われます。しかし、その後、あなたの条件に応じて、あなたはフレームAを作成し、それを可視に設定することができます。