私は自分の質問に対する解決策をあちこち探してきましたが、検索用語を定義することさえ困難です。
ユーザーがタスクを完了する際に、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());
}
}