Java 从JOptionPane到线程的异步通信

Java 从JOptionPane到线程的异步通信,java,multithreading,swing,asynchronous,joptionpane,Java,Multithreading,Swing,Asynchronous,Joptionpane,我试图弄清楚如何将变量从JOptionPane设置为正在运行的主线程。根据JOptionPane对话框的结果,这将影响该主线程中的某些逻辑。下面是一个粗略的例子: public class MainThread { public static void main(String[] args) { Timer timer = new Timer(); timer.scheduleAtFixedRate(new M

我试图弄清楚如何将变量从
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();    
    }    
}
我可能走错了方向。也许我应该将
JPanel
ActionListener
一起使用?还是一个
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;
            }    
        }    
    }    
}
您的第一个“粗略示例”离有效解决方案不远(如果我正确理解了问题):

  • MyTask
    类中添加一个
    reset()
    方法,如果用户决定重置,该方法将执行任何应该发生的操作
  • 将构造函数添加到
    AsyncPopUp
    类中,该类需要
    MyTask
    对象作为参数,并将其保存到字段
    task
  • MyTask
    类中执行
    newasyncPopup
    时,将
    作为构造函数参数传递
  • 执行
    System.out.println(“将消息发送到要重置的任务”)
    调用
    task.reset()

顺便说一句:请注意,
if(response==JOptionPane.YES\u选项)
看起来比
if(response==0)
.-)

你到底想达到什么目的?您发布的代码将(假设AsyncPopup按暗示方式工作)在10秒后显示一个弹出窗口,然后每秒钟显示一次。你问题中的措辞意味着做相反的事情(显示一个弹出窗口,然后更新主线程对象上的状态)。我试图在不停止主循环的情况下从用户那里获取输入。对话框的响应将影响主循环。在本例中,10秒后会出现一个弹出对话框,而不会暂停主循环(x==10)。它仅在x==10时出现。我需要对话框的响应来确定是否需要重置计数器。但是,我需要计数器在等待响应时继续。我将检查SecondaryLoop的链接,这可能会解决我的问题。SecondaryLoop似乎不允许异步?