【问题标题】:asynchronous communication to thread from JOptionPane从 JOptionPane 到线程的异步通信
【发布时间】:2012-03-06 06:45:16
【问题描述】:

我试图弄清楚如何将变量从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;
            }    
        }    
    }    
}

【问题讨论】:

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

标签: java multithreading swing asynchronous joptionpane


【解决方案1】:

您的第一个“粗略示例”距离可行的解决方案并不遥远(如果我正确理解了这个问题):

  • 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) 更好... ;-)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-09-13
    • 2014-08-23
    • 2011-02-11
    • 2014-01-07
    • 1970-01-01
    • 2012-02-01
    • 2012-03-06
    相关资源
    最近更新 更多