2013-10-28 1 views
1

백그라운드에서 무언가를 실행하기 위해 SwingWorker를 사용하고 있습니다. 실행 중에 나는 JoptionPane.showOptionDialog()를 던져 사용자에게 무엇인가를 물어볼 필요가있는 조건을 가지고있다. 내 모델 클래스에서이 작업을 수행하고 싶지 않으며 SwingWorker.doInBackground가 실행될 때이 작업을 수행하지 않습니다.SwingWorker doInBackground가 실행될 때 사용자 입력

많은 사람들이이 문제에 직면했을 것으로 확신합니다.

그래서 doInBackground에 대한 호출에서 돌아와 done()에서 사용자 입력을 요청해야합니다. 그런 다음 다른 SwingWorker를 시작하고 done 메소드에서 doInBackground()를 실행해야합니까?

이렇게하는 또 다른 간단하고 간단한 방법이 있습니까? (mkorbel의 질문에 대한)

업데이트

클래스 설계는 다음과 같이이다 :

public class OptionInSwingWorker { 

    public static void main(String[] args) { 
     JFrame frame=new JFrame(); 
     JButton test = new JButton("Test"); 
     frame.add(test); 

     test.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       new SwingWorker<Void,Void>(){ 
        @Override 
        protected Void doInBackground() throws Exception { 
         // check for a value in the database 

         // if value is something.. throw up an OptionPane 
         // and ask the user a question.. 
         // then do something... 
         return null; 
        } 


        @Override 
        protected void done() { 
         // open some other dialog 
        } 
       }.execute(); 
      } 
     }); 

    } 
} 
+0

이전에는 작업 스레드의 Window 및 진행중인 메서드에 대한 참조를 전달하는 데 JOption을 호출하는 데 사용되었습니다. 그러나 좋은 생각이 아닙니다. 제대로 처리되지 않으면 많은 팝업으로 끝날 것입니다. 일부 기본 값으로 조인을 닫으려면 시간 제한을 사용하십시오 –

+0

실행하는 동안 ..., 중첩 된 void 또는 SwingWorker에서 실행하는 클래스의 예외에 대해 이야기하고 있습니다. – mKorbel

답변

4

가 프롬프트를 수행하고 다시 SwingWorker의에 결과를 반환하는 SwingUtilities.invokeLater 전화를 겁니다. 가능한 경우 SwingWorker를 계속 움직여야합니다. 그렇지 않으면 응답을 확인하는 동안 루프가 발생하고 대기하게됩니다.

이렇게하면 나중에 새 SwingWorker를 다시 시작하지 않아도됩니다. 비록 당신이하고있는 일에 따라, 새로운 SwingerWorker를 시작하는 것이 실제로는 더 깨끗하고 명확해질 수 있습니다.

관련 문제