有些JDialog有问题

我目前正在试图打印一个消息给用户在我正在做的程序,但不知何故结果是不是我所期望的。 作为一个例子,我使用了Oracles的消息对话框消息,这个消息是:

JOptionPane.showMessageDialog(frame, "Eggs are not supposed to be green."); 

我得到这个(注意最后缺less的点和button中缺less的K):

计划的输出

这可能是我的JDK或JRE出了问题吗? 此外,我不知道它是否可以是重要的,但我正在eclipse平台上编程,在Windows 7上运行。

编辑number1:作为sugested,我尝试了一个更简单的例子,并得到了相同的结果。 这里是更简单的例子的代码:

 public class SampleGUI { public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { JOptionPane.showMessageDialog( null, "Eggs are not supposed to be green."); } }); } } 

编辑号码2:为了让事情变得更加奇怪,我似乎能够通过将笔记本电脑连接到sockets来避免这种结果。 这似乎是非常愚蠢的,我只能认为这是我的电脑有问题。 有什么可以做到这一点?

edit2上的更新:似乎每次都不行。 由于我无法解释的原因,我已经尝试了几分钟前我的笔记本电脑充电,我得到了相同的结果。

编辑号码3:我已经configuration了与Windows 7和Ubuntu 14.04双启动,我也无法重现在Ubuntu的错误。

我想首先修改这个问题,因为我认识到这个对话框,而源代码可以帮助你解释你的想法,

http://docs.oracle.com/javase/tutorial/uiswing/components/dialog.html

现在,将JOptionPane.showMessageDialog放入invokeLater的冲动是正确的,即使示例程序没有; 示例程序生成对话框以响应MouseEvent / ActionEvent ,因此确保了线程安全。 你的代码从一个新线程的静态上下文开始,所以invokeLater是正确的。

接下来会发生什么是有趣的,因为摆动可能会导致其意图避免的问题:当前的EventDispatchThread失速和一个新的事件泵开始处理对话上的事件。 由于所有绘图也发生在美国东部时间,我有一个偷偷摸摸的疑问,无论是paintlayout在你的原始美国东部时间迷路了。

而不是调用便利的方法,试试这个中间版本:

 public class SampleGUI { public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { JOptionPane optionPane = new JOptionPane("Eggs are not supposed to be green."); JDialog generatedDialog = optionPane.createDialog("Message"); generatedDialog.setVisible(true); } }); } } 

上面的内容应该相当于http://developer.classpath.org/doc/javax/swing/JOptionPane-source.html (第926行,第368行)

除了现在你有一个JDialog,你可以repaintinvalidatepack ,以确保一切正常显示。