如何在EDT上运行JOptionPane?

仍然遇到空白的JOptionPane问题。 基于SO和Java Docs的研究 ,这显然与不使用EDT 。 我的问题是EDT及其方法究竟如何适用于JOptionPane ? 例如,终端错误输出清楚地表明下面的JOptionPane没有在EDT上运行。 特别缺少什么, Runnable东西怎么样?

 import javax.swing.*; public class PaneDemo { public static void main(String[] args) { final String[] TEXT ={ //message "Hello, World!", //title "Greeting"};//end TEXT showMyPane(TEXT); }//end main public static void showMyPane(final String[] TEXT) { JOptionPane.showMessageDialog(null, TEXT[0], TEXT[1], JOptionPane.INFORMATION_MESSAGE); if(!SwingUtilities.isEventDispatchThread()) { System.err.println("Err: GUI failed to use EDT."); }//end if(!SwingUtilities.isEventDispatchThread()) }//end showMyPane }//end class PaneDemo 

答案建议添加invokeLater 。 然而,这似乎并没有在BlueJ中表现得很好。

BlueJ截图

isEventDispatchThread()仍然在终端中返回错误。 这只是因为它现在在错误的位置?

您可以在Event Dispatch Thread上创建JOptionPane ,如下所示:

在此处输入图像描述

  final String[] TEXT = { //message "Hello, World!", //title "Greeting"};//end TEXT ... /** * Create GUI and components on Event-Dispatch-Thread */ javax.swing.SwingUtilities.invokeLater(new Runnable() { @Override public void run() { JOptionPane.showMessageDialog(null, TEXT[0] + "\n is on EDT: " + SwingUtilities.isEventDispatchThread(), TEXT[1], JOptionPane.INFORMATION_MESSAGE); } }); 

看一下课程:Swing中的并发性应该可以帮助你理解它的全部内容

更新:

根据评论你应该在showPane(...)方法的每个调用上在EDT上启动JOptionPane ,如下所示:

  public static void showMyPane(final String[] TEXT) { javax.swing.SwingUtilities.invokeLater(new Runnable() { @Override public void run() { JOptionPane.showMessageDialog(null, TEXT[0] + "\n is on EDT: " + SwingUtilities.isEventDispatchThread(), TEXT[1], JOptionPane.INFORMATION_MESSAGE); } }); }//end showMyPane public static void main(String[] args) { final String[] TEXT = { //message "Hello, World!", //title "Greeting"};//end TEXT showMyPane(TEXT); }