Java 等待Swing接口关闭,然后继续

Java 等待Swing接口关闭,然后继续,java,swing,countdownlatch,Java,Swing,Countdownlatch,我一直在到处寻找我的问题的答案,但我甚至很难定义我的搜索词 我有一个方法,使用invokeLater创建Swing GUI,用户在其中完成一些任务。任务完成后,窗口关闭,初始调用线程(如方法)应恢复执行。更具体地说,以下是该方法的摘要: public class dfTestCase extends JFrame{ public dfTestCase{ ... //GUI code here } public String run() {

我一直在到处寻找我的问题的答案,但我甚至很难定义我的搜索词

我有一个方法,使用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并对其进行倒计时

虽然倒计时闩锁可以工作,但它不适合我的用途,因为我需要多次运行这个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
iso
invokeLater
应允许您捕获用户输入,并仅在释放UI时继续调用线程

模态对话框和
SwingUtilities#invokeAndWait
iso
invokeLater
应允许您捕获用户输入,且仅当UI被释放时继续调用线程

“等待Swing界面关闭再继续”我不理解它的大部分其余部分,但标题是“模态对话框”。您上面提到的Swing GUI是否由另一个Swing GUI显示?如果是这样,@Andrew已经给了你最好的解决方案。考虑通过添加更多的重要细节来澄清你的问题。如果上面的评论不适用,你可以简单地每次创建一个新的锁存器。或者,您也可以使用自行车夫,它可以满足您的要求(可以多次使用)。谢谢您的建议,我对不清楚表示歉意。我对示例代码做了一些更改,以更好地反映我正在尝试做的事情。我希望它现在更有意义。不,SwingGUI不是由另一个SwingGUI窗口显示的。它是通过我的应用程序代码初始化和执行的(如果这是正确的术语)。“等待Swing界面关闭再继续”我不理解它的大部分其余部分,但标题是“模态对话框”。您上面提到的Swing GUI是否由另一个Swing GUI显示?如果是这样,@Andrew已经给了你最好的解决方案。考虑通过添加更多的重要细节来澄清你的问题。如果上面的评论不适用,你可以简单地每次创建一个新的锁存器。或者,您也可以使用自行车夫,它可以满足您的要求(可以多次使用)。谢谢您的建议,我对不清楚表示歉意。我对示例代码做了一些更改,以更好地反映我正在尝试做的事情。我希望它现在更有意义。不,SwingGUI不是由另一个SwingGUI窗口显示的。它是通过我的应用程序代码初始化和执行的(如果这是正确的术语)。