【问题标题】:Something wrong with JDialogJDialog 有问题
【发布时间】:2014-06-02 10:02:52
【问题描述】:

我目前正在尝试在我正在制作的程序中向用户打印一条消息,但不知何故,结果不是我所期望的。例如,我使用了 Oracle 对消息对话框的建议,即:

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

我明白了(注意最后缺少的点和按钮中缺少的 K):

这可能是我的 JDK 或 JRE 有问题吗?另外,我不知道它是否重要,但我在 Eclipse 平台上编程,在 Windows 7 上运行。

编辑编号1: 按照建议,我尝试了一个更简单的示例并得到了相同的结果。这是更简单示例的代码:

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

【问题讨论】:

  • 每当我认为 Java 有问题时,99.9% 的错误都在于我对 Java 的理解而不是 Java 本身。我会给你同样的赔率。请创建并发布minimal example program。让我们自己看看。
  • 我相信这足以作为一个最小的例子,因为我没有机会编写比这更多的代码。尽管如此,我会尝试更简单的方法,然后编辑问题。感谢您的评论。
  • 无法重现图示效果。
  • Swing 似乎错误地计算了对话框的大小。你可以手动调整diaoue的大小并让缺失的字符出现吗?我的猜测是您以某种方式“放大”了您的桌面(在具有超高分辨率的显示器上使用较大的字体),而 Swing 无法很好地处理这一点。
  • @tobias_k:看起来是这样,但我根本没有修改我的桌面(至少据我所知)。您能否提供一个代码示例,展示如何在通过JOption.showMessageDialog(null,"Message"); 创建对话框时调整对话框的大小?

标签: java windows eclipse swing jdialog


【解决方案1】:

我想先修改这个问题,因为我认识那个对话框,并且来源可以帮助解释你从哪里得到了按照你的方式编写代码的想法:

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

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

接下来发生的事情很有趣,因为 swing 可能会导致它本应避免的问题:当前的 EventDispatchThread 停止并且新的事件泵开始处理对话框上的事件。由于所有绘图也发生在 EDT 上,我暗中怀疑 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 戳以确保一切正常显示。

【讨论】:

  • 我已经有几个星期没有使用 Windows 了,自从我改变了以后,我再也没有看到这个错误。更多,即使在 Windows 上我尝试了 Swing 并没有得到一个图形“错误”,所以这对我来说很奇怪。然而,我确实接受了你的回答,因为我相信你是对的,尽管我无法再次重现这种效果。 +1 教我如何拥有一个可戳的 JDialog。它应该很快就会证明自己有用!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-03
  • 2023-03-21
相关资源
最近更新 更多