2012-03-06 52 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

什么是你真正想达到什么目的?您发布的代码(假设AsyncPopup作品所暗示的)10秒后显示弹出,那么每一秒开始。你的问题中的措辞意味着做相反的事情(显示弹出窗口然后更新主线程对象的状态)。 – SimonC 2012-03-06 06:49:59

+0

检查了这一点http://docs.oracle.com/javase/7/docs/api/java/awt/SecondaryLoop.html – MahdeTo 2012-03-06 12:28:44

+0

有一个主循环是一个简单的计数器。我正在尝试从用户处获得输入而不停止主循环。对话框的响应会影响主循环。在这个例子中,10秒后出现一个弹出对话框而不暂停主循环(x == 10)。它仅在x == 10时出现。我需要对话框的响应来确定是否需要重置计数器。不过,我需要计数器在等待响应时继续。我将查看可能解决我的问题的SecondaryLoop链接。 – 2012-03-06 13:31:08

回答

0

你的第一个“粗如”不那么远的地方工作解决方案(如果我理解正确的问题):

  • 添加reset()方法你MyTask类,如果用户决定不复位应该发生什么。
  • 添加一个构造函数,以您的AsyncPopUp类需要一个MyTask对象作为参数,并将它保存到现场task
  • 当您在MyTask类做new AsyncPopUp,通过this作为构造函数的参数
  • 地方,你System.out.println("Send Message to task to reset")电话task.reset()

顺便说一句:请注意,if (response == JOptionPane.YES_OPTION)看起来比if (response == 0)更好... ;-)