我一直在寻找解决问题的方法,但我什至很难定义我的搜索词。
我有一个方法可以使用 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 中,我有用于关闭按钮的 actionListeners 并对 CountDownLatch 进行倒计时。
虽然 CountDownLatch 有效,但它不适合我的目的,因为我需要多次运行此 GUI,并且无法增加锁存器。我正在寻找一个更优雅的解决方案 - 我最好的猜测是我需要使用线程,但我不确定如何去做。
任何帮助将非常感激!
更新 一些澄清:正在发生的事情是一个外部类正在调用 dfTestCase.run() 函数并期望返回一个字符串。本质上,流程与调用 dfTestCase.run() 的外部类是线性的--> 被调用的 GUI--> 用户做出决定并单击按钮--> 返回初始调用线程的控制并 run()完成了。
现在我的肮脏解决方案是放一个带有标志的while循环来连续轮询GUI的状态。我希望其他人最终可以提出一个更优雅的解决方案。
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());
}
}