JDialog出了点问题

时间:2014-04-17 23:04:37

标签: java windows eclipse swing jdialog

我目前正在尝试在我正在制作的程序中向用户打印消息,但不知何故,结果不符合我的预期。作为一个例子,我使用Oracles消息进行消息对话,这是:

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

我明白了(注意结尾处缺少的点和按钮中缺少的K):

Ouput of the Program

我的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上重现错误。

1 个答案:

答案 0 :(得分:1)

我想首先修改这个问题,因为我识别该对话框,并且源代码可以帮助解释您的想法,以您的方式对其进行编码:

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

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

接下来发生的事情很有意思,因为摆动可能导致它要避免的问题:当前的EventDispatchThread档和一个新的事件泵开始处理对话框上的事件。由于所有绘图也发生在美国东部时间,我有一种潜在的怀疑,即paintlayout在您的原始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,您可以使用repaintinvalidatepack来确保一切正常显示。