我目前正在试图打印一个消息给用户在我正在做的程序,但不知何故结果是不是我所期望的。 作为一个例子,我使用了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
失速和一个新的事件泵开始处理对话上的事件。 由于所有绘图也发生在美国东部时间,我有一个偷偷摸摸的疑问,无论是paint
或layout
在你的原始美国东部时间迷路了。
而不是调用便利的方法,试试这个中间版本:
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,你可以repaint
, invalidate
或pack
,以确保一切正常显示。