Java 如何防止空白JOptionPane窗口

Java 如何防止空白JOptionPane窗口,java,swing,joptionpane,Java,Swing,Joptionpane,可能重复: 在看似随机的时间(即,如果程序运行的次数足够多),我已编程的JOptionPane窗口将显示一个空白窗口关闭和确定按钮,但没有我编码的文本。这似乎最终会发生在使用JOptionPane编写的任何程序中;有什么方法可以防止这种情况吗?FWIW这种情况很少(如果有的话)连续发生两次 我刚刚写了这个,并且连续运行了15次,没有任何问题。这与我在使用JOptionPane时使用的编码完全相同。有什么东西不见了吗 import javax.swing.JOptionPane; public

可能重复:

在看似随机的时间(即,如果程序运行的次数足够多),我已编程的
JOptionPane
窗口将显示一个空白窗口关闭和确定按钮,但没有我编码的文本。这似乎最终会发生在使用
JOptionPane
编写的任何程序中;有什么方法可以防止这种情况吗?FWIW这种情况很少(如果有的话)连续发生两次

我刚刚写了这个,并且连续运行了15次,没有任何问题。这与我在使用
JOptionPane
时使用的编码完全相同。有什么东西不见了吗

import javax.swing.JOptionPane;
public class SimpleJOptionPane
{
    public static void main(String[] args)
    {
        JOptionPane.showMessageDialog(null, "Hello, World!");
    }//end main
}//end class SimpleJOptionPane
一般来说,这个问题不会发生。
JOptionPane
通常与预期文本一起显示。如果它不起作用,没有我的知识,会有什么变化

正如一篇评论中所建议的,我正在考虑使用EventQueue.isDispatchThread()

如您所见,下面的代码使用另一种方法来显示JOptionPane。这是一个适当的解决方案吗

final String ERR_TITLE = "Error";
final String ERR_MSG = "An exception has occured; please start over.";
                    showError(ERR_MSG, ERR_TITLE);

public static void showError(final String MESSAGE, final String TITLE)
{
    JOptionPane.showMessageDialog(null, MESSAGE, TITLE, JOptionPane.ERROR_MESSAGE);
}//end showError

如果我是你,我会这么做:

  • 创建一个静态方法,委托执行JOptionPane
  • 确保我的所有代码都引用了该方法,而不是JOptionPane
  • 在该静态方法中,检查空字符串和空值
  • -


    我知道这听起来有点傻,但根据经验,这不是API本身的问题…

    @james在任何特定的程序中都不会出现任何程度的一致性。相反,在我使用JOptionPane编写的任何程序中,它似乎都是随机出现的。如果你愿意,我可以发布其中任何一个,你需要看多少代码?你检查过这个了吗?可能您没有在事件调度线程上执行与Swing相关的任务,请查看。如果没有,这是我最好的猜测:-)@MattB:你没有在
    EDT-事件调度线程上调用你的代码
    永远不要在
    main()
    方法或任何其他
    线程
    @MattB没有问题,总是值得检查;)一个轻微的错误,不管是哪种方式,控件都会到达
    showMessageDialog(…)
    ,所以为什么要进行检查,我们从来没有将
    showMessageDialog(…)
    放在else块中:-)这个想法只是在代码尝试发送空字符串时进行检查。除此之外…关键是要排除它。我还设置了一个EventQueue.isDispatchThread()检查,就像应该在EDT(事件调度线程)上执行错误GUI更新的另一个可能位置一样——这种“间歇性故障”问题是不遵守该规则的典型标志。有关详细信息,请参阅。@MattB,以便确定问题实际发生的位置。IE-是因为您意外地向屏幕发送了一个空白值,还是因为这是ETD问题,还是一个bug??
    public static void myShowMessage(String s) {
        if(s == null || "".equals(s)) {
            System.out.println("AHA!  gotcha ...");
        }
        JOptionPane.showMessageDialog(null, s);
    }