Java 等待Swing接口关闭,然后继续
我一直在到处寻找我的问题的答案,但我甚至很难定义我的搜索词 我有一个方法,使用invokeLater创建Swing GUI,用户在其中完成一些任务。任务完成后,窗口关闭,初始调用线程(如方法)应恢复执行。更具体地说,以下是该方法的摘要:Java 等待Swing接口关闭,然后继续,java,swing,countdownlatch,Java,Swing,Countdownlatch,我一直在到处寻找我的问题的答案,但我甚至很难定义我的搜索词 我有一个方法,使用invokeLater创建Swing GUI,用户在其中完成一些任务。任务完成后,窗口关闭,初始调用线程(如方法)应恢复执行。更具体地说,以下是该方法的摘要: public class dfTestCase extends JFrame{ public dfTestCase{ ... //GUI code here } public String run() {
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并对其进行倒计时
虽然倒计时闩锁可以工作,但它不适合我的用途,因为我需要多次运行这个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());
}
}
有关使用模型对话框的示例,可以查看我编写的ParamDialog类。特别是,签出ParamDialog.getProperties(Properties)
有关使用模型对话框的示例,您可以查看我编写的ParamDialog类。特别是,签出ParamDialog.getProperties(Properties)
模态对话框和
SwingUtilities#invokeAndWait
isoinvokeLater
应允许您捕获用户输入,并仅在释放UI时继续调用线程模态对话框和SwingUtilities#invokeAndWait
isoinvokeLater
应允许您捕获用户输入,且仅当UI被释放时继续调用线程“等待Swing界面关闭再继续”我不理解它的大部分其余部分,但标题是“模态对话框”。您上面提到的Swing GUI是否由另一个Swing GUI显示?如果是这样,@Andrew已经给了你最好的解决方案。考虑通过添加更多的重要细节来澄清你的问题。如果上面的评论不适用,你可以简单地每次创建一个新的锁存器。或者,您也可以使用自行车夫,它可以满足您的要求(可以多次使用)。谢谢您的建议,我对不清楚表示歉意。我对示例代码做了一些更改,以更好地反映我正在尝试做的事情。我希望它现在更有意义。不,SwingGUI不是由另一个SwingGUI窗口显示的。它是通过我的应用程序代码初始化和执行的(如果这是正确的术语)。“等待Swing界面关闭再继续”我不理解它的大部分其余部分,但标题是“模态对话框”。您上面提到的Swing GUI是否由另一个Swing GUI显示?如果是这样,@Andrew已经给了你最好的解决方案。考虑通过添加更多的重要细节来澄清你的问题。如果上面的评论不适用,你可以简单地每次创建一个新的锁存器。或者,您也可以使用自行车夫,它可以满足您的要求(可以多次使用)。谢谢您的建议,我对不清楚表示歉意。我对示例代码做了一些更改,以更好地反映我正在尝试做的事情。我希望它现在更有意义。不,SwingGUI不是由另一个SwingGUI窗口显示的。它是通过我的应用程序代码初始化和执行的(如果这是正确的术语)。