【问题标题】:Java GUI buttons not drawn sometimes (random). Compiz problem有时不绘制 Java GUI 按钮(随机)。编译问题
【发布时间】:2011-06-23 03:47:39
【问题描述】:

*EDIT 2:我刚刚发现这是一个compiz+java GUI 问题。这显然发生在这两个元素相交的地方。 我正在运行带有所有更新的最新 Ubuntu 11.04(经典桌面,而不是 Unity)。 Sun java 和 OpenJDK 都会出现这个问题。它与使用 Window-Rules Compiz 插件有关——我需要使用它。

如下面的 cmets 所述,我之前已验证我的控件已添加到正确的线程中。现在我发现禁用 Compiz Window-Rules 插件可以解决我的问题。由于我需要使用插件,所以我正在寻找解决方案。*

原帖:我正在开发一个 Java swing 应用程序。它是使用 NetBeans 6.9 构建的。它使用 GridBagLayout 管理器。目前的外观和感觉是 Nimbus(但这似乎对我将要描述的问题没有任何影响)。大多数用户在 Linux 上运行该应用程序。少数使用 Windows。大多数情况下,该应用程序运行良好。但有时会打开一个没有某些 GUI 按钮的视图。例如,保存和取消按钮可能会丢失。其他 GUI 元素通常会出现(尽管有一次我听说一个视图完全是空的,没有 GUI 元素——只是一个空的灰色窗口)。

如果用户使用右上角的“X”关闭该视图并简单地重新打开它,它将被正确绘制。缺少按钮问题的发生率不到 1%。关闭/重新打开序列几乎 100% 的时间修复它。 (如果我没记错的话,可能需要再次关闭/重新打开一次。)

通常,如果缺少某些按钮,其他元素仍然可以正确绘制。这不会影响整个视图(表单)。它似乎影响了最下面的面板,但我不确定这是否真的是一个可重复的模式。重现这一点非常困难。我每天都使用该软件,而我每个月看到的次数少于一次。少数用户更频繁地看到它,但仍然很少见。

没有错误消息。我不知道接下来要尝试什么。这种行为在不同的计算机、不同的 Linux 发行版(尽管都基于 Debian)以及许多不同的代码更改(包括更改布局管理器)中持续存在。 (我们之前使用过 NetBeans GUI 设计器。)有什么想法吗?

编辑:2011.07.05 代码大致是这样的:

public void show_some_view() {
    setTitle(...)
    setLayout(new GridBagLayout());
    JPanel butnPanel = new JPanel();
    butnPanel.setLayout(new GridBagLayout());
    try {
        //add stuff to panels (butnPanel, etc.)
    } catch (Exception e) {
        Logger.log(e);
    }
    setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
    int[] wh = ApplicationContext.get().getDisplayWidthxHeight();
    setSize(wh[0], wh[1]);
    setFocusable(true);
    setVisible(true);
}

【问题讨论】:

  • 我还没有找到解决方案...

标签: java swing user-interface


【解决方案1】:

但有时会打开一个没有某些 GUI 按钮的视图。

  1. 确保将按钮添加到 EDT 上的 GUI。阅读 Concurrency 上的 Swing 教程部分了解更多信息。

  2. 确保在调用 setVisible(true) 之前将按钮添加到 GUI;

【讨论】:

  • 我查看了您第 2 点的所有代码。我编辑了原始问题以显示一些典型代码。我确信#2不是问题。所以这就留下了你的观点#1。 EDT = 事件分派线程。我确定这一定是问题所在。然而,解决它看起来令人生畏......
  • 我在每个向 GUI 添加按钮的方法中调用 javax.swing.SwingUtilities.isEventDispatchThread() 来检测代码。在每种情况下,返回值都是“真”。接下来我应该尝试什么?谢谢。
  • 我唯一可以建议的另一件事是您应该使用 pack() 而不是 setSize(...)。这样,每个 LAF 都将确保组件可以按其首选尺寸显示。
  • pack() 将使窗口尽可能小。考虑到屏幕尺寸,我们的应用程序需要确保窗口尽可能大。 (有视力障碍的人使用该应用程序。)
  • 尝试使用 Substance LAF (github.com/kirillcool/substance) 运行。如果您从 EDT 操作 gui 组件,它将引发异常。如果它没有抱怨,它可能不是与 EDT 相关的问题。如果您使用 pack() 而不是 setSize(...),它会起作用吗?如果您按 Ctrl-Shift-F1,您缺少的按钮是否会出现在列表中?
【解决方案2】:

我遇到了同样的问题:有时我的 JMenu 无法绘制(也在 Ubuntu 11.04 上)。 我通过添加来修复它

menuBar.setVisible(false);
menuBar.setVisible(true);

在我将它添加到我的 JFrame 之后(它已经设置为可见),就在我的代码中。 我知道这很乱,但它解决了我的问题,所以我很好。 希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-19
    相关资源
    最近更新 更多