2

拡張する 3 つのオブジェクトがあり、JFrameそれらを呼び出しましょうFrameA FrameB FrameC

FrameA私のメインアプリケーションウィンドウです。FrameAアプリケーションが登録されていない場合は、コンストラクターからと を作成FrameBFrameCます。それらは試用期間を示す単なるポップアップです。

10 回のうち 2 回はアプリケーションがフリーズし、B anc C フレームがまったく表示されず、フレーム A が応答しなくなります。

この方法でフレームを作成することの副作用があるかどうか疑問に思っていましたか?

4

4 に答える 4

2

これは、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 を使用することもできますが、責任を分離するとほとんど問題がなくなります。

于 2009-08-12T00:38:16.153 に答える
1

あなたが説明する症状は、何かがイベントスレッドをロックしているように聞こえます-これは、フレームの起動方法と関係がある場合とない場合があります-デバッガーで実行し、症状が現れ始めたら、イベントスレッドの状態。

(フレーム起動ロジックを別の場所に移動する必要があるというスレッドの他の全員に同意しますが、別のフレーム コンストラクターからフレーム コンストラクターを呼び出すことについて「安全でない」ことは何もありません。他のコンストラクターと違いはありません。設計が悪いかもしれませんが、イベント スレッドをロックしてはいけません。)

于 2009-08-12T00:51:46.753 に答える
0

JDialogを使いたいと思うでしょう。この正確なことをするために作られました。

于 2009-08-12T00:26:43.007 に答える
0

あなたの論理を考えるべきです。別のフレームのコンストラクターで新しいフレームを作成するのは奇妙に聞こえます。コンストラクターでそれを行うと、最初のフレームがまだ表示されていないことを意味します。フレーム A コンストラクターの外側にフレーム B と C を表示しないのはなぜですか。論理的には同じようです。ただし、条件によっては、フレーム A を作成して表示することができます。

于 2009-08-12T00:33:59.503 に答える