2012-05-30 4 views
0

저는 제 질문에 대한 해결책을 찾기 위해 멀고 먼 곳에서 수색을 해왔지만 제 검색 용어를 정의하는 데 어려움이 있습니다.진행하기 전에 스윙 인터페이스가 닫힐 때까지 기다리십시오.

사용자가 작업을 완료하는 invokeLater를 사용하여 스윙 GUI를 만드는 메소드가 있습니다. 작업이 완료되면 창이 닫히고 초기 호출 스레드 (예 : 메소드)가 실행을 다시 시작해야합니다. 보다 구체적으로, 여기에 방법을 요약 한 것입니다 : 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()); 
    } 
} 

, 나는 해, CountDownLatch를 닫고 카운트 다운됩니다 버튼에 ActionListener를있다.

CountDownLatch가 작동하는 동안이 GUI를 여러 번 실행해야하고 래치를 증가시킬 수있는 방법이 없으므로 내 용도에는 적합하지 않습니다. 좀 더 우아한 해결책을 찾고 있습니다. 스레드를 사용해야 할 필요가 있지만 이것이 어떻게 될지 확실하지 않은 것이 가장 좋습니다.

도움이 될 것입니다.

업데이트 일부 설명 : 어떤 일이 일어나고 것은 외부 클래스가 dfTestCase.run() 함수를 호출하고, 문자열이 반환 될 것으로 예상된다는 점이다. 본질적으로 흐름은 dfTestCase.run() -> 호출되는 GUI -> 사용자가 결정을 내리고 버튼을 클릭 함 -> 초기 호출 스레드에 대한 제어가 호출되고 실행되는 외부 클래스와 선형입니다. 완성 됐습니다.

현재로서는 더러운 해결책은 GUI의 상태를 지속적으로 폴링하는 플래그가있는 while 루프를 넣는 것입니다. 나는 다른 누군가가 결국보다 우아한 해결책을 제안하기를 바랍니다. 당신은 내가 쓴 ParamDialog 클래스를 확인하실 수 있습니다 모델 대화 상자를 사용하는 예를 들어

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

위의 스윙 GUI를 위의 다른 스윙 GUI에서 볼 수 있습니까? 그렇다면 @Andrew가 당신에게 최상의 솔루션을 제공했습니다. 중요한 세부 사항을 추가하여 질문을 명확히 해보십시오. –

+0

위의 설명이 적용되지 않으면 매번 새로운 래치를 만들면됩니다. 또는 CyclicBarrier를 사용하여 요청한 것을 수행 할 수 있습니다 (두 번 이상 사용할 수 있음). – assylias

답변

2

모달 대화 상자와 SwingUtilities#invokeAndWait ISO invokeLater 당신이 사용자 입력을 캡처하고 UI가

+1

+1 invokeAndWait isEvent에 대한 필수 테스트를하시기 바랍니다. – mKorbel