Подождите, пока интерфейс Swing закроется, прежде чем продолжить

Я искал решение своего вопроса, но у меня возникают трудности даже с определением условий поиска.

У меня есть метод, который создает графический интерфейс Swing с использованием invokeLater, где пользователь выполняет некоторые задачи. Как только задача завершена, окно закрывается, и начальный вызывающий поток (например, метод) должен возобновить выполнение. Чтобы быть более конкретным, вот краткое изложение метода:

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());
    }
 }

В графическом интерфейсе у меня есть actionListeners для кнопок, которые будут закрывать и считать CountDownLatch.

Хотя CountDownLatch работает, он не подходит для моих целей, потому что мне нужно запустить этот графический интерфейс несколько раз, и нет никакого способа увеличить защелку. Я ищу более элегантное решение - я думаю, что мне нужно использовать потоки, но я не уверен, как это сделать.

Любая помощь приветствуется!

Обновление Некоторые пояснения: происходит то, что внешний класс вызывает функцию dfTestCase.run() и ожидает, что будет возвращена строка. По сути, поток является линейным с внешним классом, вызывающим dfTestCase.run()-> вызываемый графический интерфейс -> пользователь принимает решение и нажимает кнопку -> возвращается элемент управления в исходный вызывающий поток и выполняется run () выполнен.

На данный момент мое грязное решение состоит в том, чтобы просто поставить цикл while с флагом, чтобы непрерывно опрашивать состояние графического интерфейса. Я надеюсь, что кто-то еще может предложить более элегантное решение в конце концов.

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 ответа

Модальные диалоги и SwingUtilities#invokeAndWait ISO invokeLater должен позволять вам захватывать ввод пользователя и продолжать вызывающий поток только тогда, когда пользовательский интерфейс расположен

В качестве примера использования диалогов модели вы можете проверить класс ParamDialog, который я написал. В частности, проверьте ParamDialog.getProperties (Properties);

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

Другие вопросы по тегам