2

Swing ダイアログ レイアウトを開始するときに、クラスの run メソッドで開始するかどうかに違いはありますか。

    public void run()
    {
        フレーム = 新しい JFrame();
        ...
        frame.setVisible( true );
    }

またはクラスコンストラクター?

    パブリック MyClass
    {
        フレーム = 新しい JFrame();
        ...
        frame.setVisible( true );
    }
    public void run()
    {
    }

ありがとう

4

2 に答える 2

5

はい、それは重要です。その理由は、JFrameの作成を含むほとんどのSwingコードをSwingイベントスレッド(イベントディスパッチスレッドまたはEDT)で呼び出す必要があるためです。これを行うには、通常、RunnableでSwing GUIを作成し、次のようなものを呼び出して、イベントスレッドでRunnableをキューに入れます。

SwingUtilities.invokeLater(new Runnable(){
  public void run() {
     // create your Swing GUI here
     frame = new JFrame();
     ...
     frame.setVisible( true );
  }
});

例外はrepaint()、コンポーネントのメソッドなど、スレッドセーフであるとAPIに文書化されているSwingメソッド呼び出しです。

于 2012-07-25T19:46:44.437 に答える
3

これは文脈上のものです。@hovercraftfullofeels が指摘しているように、EDT初期化を含め、すべての UI コードが で実行されていることを確認する必要があります。

で既に実行している場合は、 (本当に必要でない限り)EDTを使用する必要はありません。それ以外の場合は、呼び出しを に再同期する必要があります。InvokeLaterEDT

で確認するのがベストEventQueue.isDispatchingThread

于 2012-07-25T20:41:56.497 に答える