在线程和JOptionPane之间共享数据需要线程运行!

时间:2011-01-01 02:58:22

标签: java

            public void aMethod(){
              new Thread(new Runnable() {

                public void run() {
                   int decide = JOptionPane.showConfirmDialog(null, confirmName?, JOptionPane.YES_NO_OPTION);
                }
            }).start();
            System.out.println("Number of decison " + decide); //Can't find symbol "decide"
               }

<小时/> JOptionPane无法在没有被放入线程的情况下运行(我不知道为什么)。然而,当把它放到一个线程时,我无法从中得到变量。 P / s:这是callbackImplement Java RMI中的一个方法。 谢谢。新年快乐:P

2 个答案:

答案 0 :(得分:1)

您可以在Runnable子类中定义自定义字段,并将它们传递给构造函数:

public class MyRunnable implements Runnable {
  private int decide;

  public MyRunnable(int decide) {
    this.decide = decide;
  }

  public void run() {
    ...
  }
}

至于为什么需要在自己的线程上调用Swing方法,你可以阅读这篇文章:Threads and Swing。实际上,您不应该创建自己的线程,而只是在Swing事件调度线程上安排它:

SwingUtilities.invokeLater(new MyRunnable(decide));

答案 1 :(得分:1)

我不认为使用匿名类作为runnable类可以做到这一点。您需要创建一个命名类,它具有“决定”变量值的getter。

问题当然是主线程必须等到创建的线程完成后再调用getter来获取'decision'变量的值。

鉴于此,看起来很可疑为什么你会首先使用一个单独的线程来显示对话框。

如果你仍然想这样做,主线程需要在创建的线程上调用Thread.join,然后再调用getter来获取'decision'的值。