0

私は自分の質問に対する解決策をあちこち探してきましたが、検索用語を定義することさえ困難です。

ユーザーがタスクを完了する際に、invokeLater を使用して Swing GUI を作成するメソッドがあります。タスクが完了すると、ウィンドウが閉じ、最初の呼び出しスレッド (メソッドなど) が実行を再開する必要があります。より具体的には、メソッドの概要は次のとおりです。

public class dfTestCase extends JFrame{
    public dfTestCase{
          ... //GUI code here
    }

    public String run()
    {
        CountDownLatch c = new CountDownLatch(1);
        Runnable r = new Runnable()
        {
            public void run()
            {
                setVisible(true);  //make GUI visible
            }
        };

        javax.swing.SwingUtilities.invokeLater(r);

        //now wait for the GUI to finish
        try
        {
                testFinished.await();
        } catch (InterruptedException e)
        {
               e.printStackTrace();
        }

        return "method finished";
    }

    public static void main(String args[]){
          dfTestCase test = new dfTestCase();
          System.out.println(test.run());
    }
 }

GUI 内には、CountDownLatch を閉じてカウントダウンするボタンの actionListeners があります。

CountDownLatch は機能しますが、この GUI を数回実行する必要があり、ラッチをインクリメントする方法がないため、私の目的には適していません。私はより洗練された解決策を探しています - スレッドを利用する必要があると思いますが、どうすればよいかわかりません。

どんな助けでも大歓迎です!

更新 いくつかの明確化:何が起こっているのかというと、外部クラスが dfTestCase.run() 関数を呼び出しており、文字列が返されることを期待しています。基本的に、フローは dfTestCase.run() を呼び出す外部クラスと線形です --> GUI が呼び出されます --> ユーザーが決定を下し、ボタンをクリックします --> 最初の呼び出しスレッドへの制御が返され、run()完成されました。

今のところ、私の汚い解決策は、GUI のステータスを継続的にポーリングするフラグを指定して while ループを配置することです。最終的に、他の誰かがよりエレガントなソリューションを提案できることを願っています。

public class dfTestCase extends JFrame{
    public dfTestCase{
          ... //GUI code here
          JButton button = new JButton();
          button.addActionListener{
          public void actionPerformed(ActionEvent e){
              flag = true;
          }
          }
    }

    public String run()
    {
           Runnable r = new Runnable()
           {
                public void run(){
                      setVisible(true);  //make GUI visible
           };

           javax.swing.SwingUtilities.invokeLater(r);

           //now wait for the GUI to finish
          while (!flag){
              sleep(1000);
          }
          return "method finished";
     }

     public static void main(String args[]){
           dfTestCase test = new dfTestCase();
           System.out.println(test.run());
     }
}
4

2 に答える 2

2

モーダルダイアログとSwingUtilities#invokeAndWaitisoinvokeLaterを使用すると、ユーザー入力をキャプチャし、UIが破棄されたときにのみ呼び出しスレッドを続行できます。

于 2012-05-30T16:10:03.453 に答える
1

モデル ダイアログの使用例については、私が書いた ParamDialog クラスを参照してください。特に、ParamDialog.getProperties(Properties); を確認してください。

http://tus.svn.sourceforge.net/viewvc/tus/tjacobs/ui/dialogs/

于 2012-05-30T15:31:02.167 に答える