2012-03-06 2 views
0

JOptionPane에서 실행중인 주 스레드로 변수를 설정하는 방법을 알아 내려고하고 있습니다. JOptionPane 대화 상자의 결과에 따라 이것은 주 스레드의 일부 논리에 영향을 미칩니다. 다음은 대략적인 예입니다.JOptionPane에서 스레드에 대한 비동기 통신

public class MainThread {  
    public static void main(String[] args) {    
     Timer timer = new Timer();  
     timer.scheduleAtFixedRate(new MyTask(), 0, 1000);   
    }  
} 

public class MyTask extends TimerTask {  
    int x = 0; 
    AsyncPopUp popUp = new AsyncPopUp(); 

    public void run() {   
     // code to detect reset here 
     // x = 0;  
     x++; 
     System.out.println(x);   
     if (x==10){ 
      new AsyncPopUp().showMessage(); 
     }  
    }  
} 

public class AsyncPopUp {  
    void showMessage() {  
     Thread t = new Thread(new Runnable() {  
      @Override 
      public void run() {  
       int response = JOptionPane.showConfirmDialog(null, "Reset Counter?", 
           "Question", JOptionPane.YES_NO_OPTION); 

       if (response == 0){      
        System.out.println("Send Message to task to reset"); 
       }         
      }  
     });   
     t.start();  
    }  
} 

나는 아마도이 잘못된 방향으로 가고 있습니다. 아마도 JPanelActionListener을 사용해야합니까? 또는 SwingWorker?

감사합니다.

나는이 작업을 할 수 있습니다 생각 -이 나쁜 방법입니다 알려줘 : 내가 제대로 이해하면

public class Async { 
    private Boolean response = false; 
    private Thread t; 

    public void start() { 
     new Timer().schedule(new TimerTask() {  
      int x = 0; 

      @Override 
      public void run() {  
       System.out.println(x); 

       if (x == 10) { 
        t = new Thread(new DoTask()); 
        t.start(); 
       } 

       if (response == true) { 
        System.out.println("true"); 
        x = 0; 
        response = false; 

       } else { 
        System.out.println("false"); 
       }  
       x++;  
      } 

     }, 0, 1000);  
    } 

    public class DoTask implements Runnable {  
     @Override 
     public void run() {  
      int optionResponse = JOptionPane.showConfirmDialog(null, 
        "Reset Counter?","Question", JOptionPane.YES_NO_OPTION); 

      if (optionResponse == 0) { 
       response = true; 
      }  
     }  
    }  
} 
+0

당신이 실제로 달성하기 위해 노력하고 무엇 ... if (response == JOptionPane.YES_OPTION)if (response == 0)보다 더 낫 네요 있습니다? 게시 한 코드 (AsyncPopup가 묵시적으로 작동한다고 가정)는 10 초 후, 매초마다 팝업을 표시합니다. 귀하의 질문에 문구가 반대 (메인 스레드의 개체에 대한 상태를 업데이 트하는 팝업을 보여주는) 그래도 의미합니다. – SimonC

+0

체크 아웃 http://docs.oracle.com/javase/7/docs/api/java/awt/SecondaryLoop.html – MahdeTo

+0

간단한 카운터 인 메인 루프가 있습니다. 메인 루프를 멈추지 않고 사용자로부터 입력을 얻으려고합니다. 대화 상자의 응답은 주 루프에 영향을 미칩니다. 이 예제에서는 10 초 후에 주 루프를 일시 중지하지 않고 팝업 대화 상자가 나타납니다 (x == 10). x == 10 일 때만 나타납니다. 카운터를 재설정해야 하는지를 결정하기 위해 대화 상자의 응답이 필요합니다. 그러나 응답을 기다리는 동안 카운터를 계속 사용해야합니다. 내 문제를 해결할 수있는 SecondaryLoop 링크를 확인합니다. –

답변

0

첫 번째 "거친 예"(너무 멀리 떨어져 작업 솔루션에서 아닙니다 질문) :

  • 사용자가 재설정하기로 결정하면 어떻게해야 않는 무엇이든 MyTask 클래스에 reset() 방법을 추가합니다.
  • MyTask 개체를 인수로 사용하는 AsyncPopUp 클래스에 생성자를 추가하고 task 필드에 저장합니다. 당신이 당신의 MyTask 클래스 new AsyncPopUp 작업을 수행 할 때
  • , 생성자 인자는 System.out.println("Send Message to task to reset") 전화 task.reset()
  • this를 전달합니다. 그런데

는 : ;-)

관련 문제