我正在尝试在我正在制作的程序中向用户打印消息,但不知何故结果不是我所期望的.作为一个例子,我使用了Oracles sugest消息对话框,它是:
JOptionPane.showMessageDialog(frame, "Eggs are not supposed to be green.");
我明白了(注意结尾处缺少的点和按钮中缺少的K):
我的JDK或JRE可能有问题吗?此外,我不知道它是否重要,但我正在eclipse平台上编程,在Windows 7上运行.
编辑号码1:
作为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:为了让事情变得更奇怪,我似乎可以通过将笔记本电脑连接到插座来避免这种结果.这看起来非常愚蠢,我只能认为我的电脑出了问题.什么能让这件事发生?
关于edit2的更新:它似乎每次都不起作用.由于我无法解释的原因,我几分钟前尝试过我的笔记本电脑充电,我得到了相同的结果.
编辑number3:我已经配置了Windows 7和ubuntu 14.04的双启动,我也无法在ubuntu上重现错误.
解决方法:
我想首先修改这个问题,因为我认识到这个对话框,并且源代码可以帮助解释你在哪里有想法以你的方式编写代码:
http://docs.oracle.com/javase/tutorial/uiswing/components/dialog.html
现在,将JOptionPane.showMessageDialog放入invokeLater的冲动是正确的,即使示例程序没有;示例程序生成对话框以响应MouseEvent / ActionEvent,因此确保了线程安全.您的代码从新线程上的静态上下文开始,因此invokeLater是正确的.
接下来发生的事情很有意思,因为swing可能会导致它要避免的问题:当前的EventDispatchThread停止并且新的事件泵开始处理对话框上的事件.由于所有的绘画也发生在美国东部时间,我怀疑你的原始EDT上的油漆或布局都会丢失.
尝试此中间版本,而不是调用便捷方法:
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,你可以用重绘,无效或打包来确保一切正常显示.