我一直在寻找我的问题的解决方案,但我甚至难以定义我的搜索条件。
我有一个方法,使用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,它们将关闭并且CountDown CountDownLatch。
虽然CountDownLatch工作,但它不适合我的目的,因为我需要多次运行此GUI,并且无法增加锁存器。我正在寻找一个更优雅的解决方案 - 我最好的猜测是我需要使用线程,但我不确定如何解决这个问题。
任何帮助将不胜感激!
更新 一些澄清:发生的事情是外部类正在调用dfTestCase.run()函数并期望返回一个String。本质上,流是线性的,外部类调用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());
}
}
答案 0 :(得分:2)
模态对话框和SwingUtilities#invokeAndWait
iso invokeLater
应该允许您捕获用户输入,并且只在UI处理时继续调用线程
答案 1 :(得分:1)
有关使用模型对话框的示例,您可以查看我编写的ParamDialog类。特别是,请查看ParamDialog.getProperties(Properties);
http://tus.svn.sourceforge.net/viewvc/tus/tjacobs/ui/dialogs/