从JOptionPane到线程的异步通信

时间:2012-03-06 06:45:17

标签: java multithreading swing asynchronous joptionpane

我试图弄清楚如何将变量从JOptionPane设置为正在运行的主线程。根据{{​​1}}对话框的结果,这会影响该主线程中的某些逻辑。这是一个粗略的例子:

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

1 个答案:

答案 0 :(得分:0)

你的第一个“粗略的例子”离工作解决方案不远(如果我正确理解了这个问题):

  • reset()课程添加MyTask方法,该方法会执行用户决定重置时应执行的任何操作。
  • AsyncPopUp类中添加一个构造函数,该类需要MyTask个对象作为参数,并将其保存到字段task
  • new AsyncPopUp课程中执行MyTask时,将this作为构造函数参数传递
  • System.out.println("Send Message to task to reset")致电task.reset()

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