等待Swing Interface关闭然后再继续

时间:2012-05-30 15:24:45

标签: java swing countdownlatch

我一直在寻找我的问题的解决方案,但我甚至难以定义我的搜索条件。

我有一个方法,使用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());
     }
}

2 个答案:

答案 0 :(得分:2)

模态对话框和SwingUtilities#invokeAndWait iso invokeLater应该允许您捕获用户输入,并且只在UI处理时继续调用线程

答案 1 :(得分:1)

有关使用模型对话框的示例,您可以查看我编写的ParamDialog类。特别是,请查看ParamDialog.getProperties(Properties);

http://tus.svn.sourceforge.net/viewvc/tus/tjacobs/ui/dialogs/