2009-08-27 12 views
16

プログラムが起動すると、新しいJFrameが作成されます。ユーザーが開始ボタンをクリックすると、スレッドが作成され、開始されます。このスレッドの実行の一部は、フォーム上のデータを検証し、そのデータで実行することです。データが検証されると、スレッドは元のフレームでdispose()を呼び出し、コントロールパネルとして機能する新しいJFrameを作成します。JavaでJFrameを閉じるまでスレッドが待機するようにするにはどうすればよいですか?

また、GUIをまったく表示しないプログラムの自動モードもあります。このモードでは、構成ファイルからデータを読み取り、実行スレッドを開始し、コントロールパネルなしですべてを実行します。

スレッドが完了するとプログラムは終了しますが、GUIモードでは、ユーザーがコントロールパネルも閉じた場合にのみ、プログラムを終了します。 スレッドがフレームを閉じるのを待たせることは可能ですか?私はフレームがそれ自身のスレッドから実行されていると仮定しますか?そうでない場合もあります。

ありがとうございました。

答えて

23

あなたが選んだ答えは少し厄介です。 Thread.sleep(1000)を使用すると、1秒ごとにウィンドウの状態がチェックされます。パフォーマンス上の問題ではなく、コーディングスタイルが悪いだけです。また、1秒の応答時間があるかもしれません。

このコードは少し上手くいく。

private static Object lock = new Object(); 
private static JFrame frame = new JFrame(); 
/** 
* @param args 
*/ 
public static void main(String[] args) { 

    frame.setSize(300, 300); 
    frame.setDefaultCloseOperation(JFrame.HIDE_ON_CLOSE); 
    frame.setVisible(true); 

    Thread t = new Thread() { 
     public void run() { 
      synchronized(lock) { 
       while (frame.isVisible()) 
        try { 
         lock.wait(); 
        } catch (InterruptedException e) { 
         e.printStackTrace(); 
        } 
       System.out.println("Working now"); 
      } 
     } 
    }; 
    t.start(); 

    frame.addWindowListener(new WindowAdapter() { 

     @Override 
     public void windowClosing(WindowEvent arg0) { 
      synchronized (lock) { 
       frame.setVisible(false); 
       lock.notify(); 
      } 
     } 

    }); 

    t.join(); 
} 
+1

ええ、私はそれがより良い理由がわかります。ありがとう。 –

+0

最後にt.join()が見つからないと思います。 –

+0

はい、ありがとうございます。 –

1

スレッドからJFrameへの参照を行うことができます。次に、JFrameのデフォルトクローズ操作をHIDE_ON_CLOSEに設定します。 JFrameが閉じている場合は、スレッドを停止できます。

例コード:

import java.awt.Dimension; 

import javax.swing.JFrame; 

public class FrameExample extends JFrame { 

    public FrameExample() { 
     setSize(new Dimension(100, 100)); 
     setDefaultCloseOperation(HIDE_ON_CLOSE); 
     setVisible(true); 

    } 

    private static class T implements Runnable { 

     private FrameExample e; 

    public T(FrameExample e) { 
     this.e = e; 
    } 

    @Override 
    public void run() { 
     while (true) { 
      if (e.isVisible()) { 
       // do the validation 
       System.out.println("validation"); 
       try { 
        Thread.sleep(1000); 
       } catch (InterruptedException e1) { 
        break; 
       } 
      } 
     } 
    } 

} 

public static void main(String[] args) { 
    FrameExample frameExample = new FrameExample(); 

    new Thread(new T(frameExample)).start(); 
    } 
} 
+0

ありがとうございました。 –

2

のJFrameを含むすべてのSwingコンポーネントは、イベントディスパッチスレッド、またはEDTと呼ばれる、単一のスレッドによって管理されています。 (Swingオブジェクトのメソッドを他のスレッドから呼び出すことは可能ですが、ここでは関係のない場合を除き、通常は安全ではありません)。

おそらく、データの検証と実行コードそうでなければ外界を完全に知らない独自の目的で使用されます。次に、GUIを管理するオブジェクトと「自動モード」で動作するオブジェクトのうちの一方から2つを呼び出します。

関連する問題