java - 如何在 EDT 上运行 JOptionPane?

标签 java swing joptionpane event-dispatch-thread

仍然对空白 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 Screenshot

此外,isEventDispatchThread() 仍在终端中返回错误。仅仅是因为它现在位于错误的位置吗?

最佳答案

您可以在 Event Dispatch Thread 上创建 JOptionPane像这样:

enter image description here

  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);
        }
    });

看看 Lesson: Concurrency in 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);
    }

关于java - 如何在 EDT 上运行 JOptionPane?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13093499/

相关文章:

java - 从 Hashmap 填充 JList 并检索键

java - 将多个荧光笔设置为 jeditorpane

java - JMenu 弹出窗口有时有效

java - 验证 JOptionPane.ShowInputDialog 中的用户输入

java并发: lightweight nonblocking semaphore?

java - ActiveMQ接收消息的不同方式

java - 在应用程序初始化时进行必要和充分的验证

java - JButton选择后的移动方法

java - 如何播放另一个文件的声音

java - 如何在 JOptionPane 中打印数组?