0

我一直在寻找解决问题的方法,但我什至很难定义我的搜索词。

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

2 回答 2

2

模态对话框和SwingUtilities#invokeAndWaitisoinvokeLater应该允许您捕获用户输入,并且仅在释放 UI 时继续调用线程

于 2012-05-30T16:10:03.453 回答
1

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

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

于 2012-05-30T15:31:02.167 回答