我目前正在尝试在我正在制作的程序中向用户打印消息,但不知何故,结果不符合我的预期。作为一个例子,我使用Oracles消息进行消息对话,这是:
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上的更新:它似乎每次都不起作用。由于我无法解释的原因,几分钟前我已经尝试使用笔记本电脑充电,并且我得到了相同的结果。
编辑数字3:我已经使用Windows 7和ubuntu 14.04配置了双启动,我也无法在ubuntu上重现错误。
答案 0 :(得分:1)
我想首先修改这个问题,因为我识别该对话框,并且源代码可以帮助解释您的想法,以您的方式对其进行编码:
http://docs.oracle.com/javase/tutorial/uiswing/components/dialog.html
现在,将JOptionPane.showMessageDialog
放入invokeLater
的冲动是正确的,即使示例程序没有;示例程序生成对话框以响应MouseEvent
/ ActionEvent
,因此确保了线程安全。您的代码从新线程上的静态上下文开始,因此invokeLater
是正确的。
接下来发生的事情很有意思,因为摆动可能导致它要避免的问题:当前的EventDispatchThread
档和一个新的事件泵开始处理对话框上的事件。由于所有绘图也发生在美国东部时间,我有一种潜在的怀疑,即paint
或layout
在您的原始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,您可以使用repaint
,invalidate
或pack
来确保一切正常显示。