2012-05-30 3 views
0

Я искал ближайший и далеко идущий решение моего вопроса, но у меня возникли трудности с определением условий поиска.Подождите, пока интерфейс Swing будет закрыт, прежде чем продолжить.

У меня есть метод, который создает Swing GUI с помощью 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()); 
    } 
} 

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

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

Любая помощь была бы высоко оценена!

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

На данный момент мое грязное решение состоит в том, чтобы просто поставить цикл 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()); 
    } 
} 
+7

* «Подождите, свинг интерфейс, чтобы закрыть перед продолжением» * я не понимает большую часть остальной части, но название кричит *** «модальный диалог». *** –

+0

Является ли это графическим интерфейсом Swing, на который вы ссылаетесь выше, отображаемым другим графическим интерфейсом Swing? Если это так, @Andrew дал вам лучшее решение. Поясните свой вопрос, добавив больше важных деталей. –

+0

Если вышеприведенные комментарии не применяются, вы можете просто создать новую защелку каждый раз. Кроме того, вы можете использовать CyclicBarrier, который делает то, что вы просите (может использоваться более одного раза). – assylias

ответ

2

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

+1

+1 пожалуйста, invokeAndWait требуется тестирование для isEvent .... – mKorbel

Смежные вопросы