【问题标题】:Java Swing - GUI not refreshing or freeze after java 1.8 updatesJava Swing - Java 1.8 更新后 GUI 不刷新或冻结
【发布时间】:2015-06-16 04:22:27
【问题描述】:

我有一个工作应用程序,它在 Java 1.6 和 1.7 甚至 1.8 update 31 中都能正常工作。我今天刚刚更新了我的 Java 1.8 update 45,发现我的应用程序界面有问题。例如: 这是我的工作应用程序屏幕。这是应该的,但更新后它变成了这样(下图): 一旦我得到无法运行的界面,我需要单击该区域,或者我需要最小化应用程序并再次打开以恢复正常。

代码

frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
tab.setTabPlacement(2);
frame.add(tab, BorderLayout.SOUTH);
ComparePanelMin cmp = new ComparePanelMin();
tab.add("Compare", cmp);
ReportPanelMin rp = new ReportPanelMin();
tab.add("Reporting (For Single Compare)", rp);
ChangeListener changeListener = new ChangeListener() {
@Override
public void stateChanged(ChangeEvent changeEvent) {
idx = tab.getSelectedIndex();
}

上面的代码在标签之间切换。非常感谢任何建议或参考链接。 已编辑
死锁

【问题讨论】:

  • 考虑提供一个runnable example 来证明您的问题。这不是代码转储,而是您正在做的事情的一个例子,它突出了您遇到的问题。这将减少混乱并获得更好的响应
  • 我认为 JVM 无法绘制/重绘 JFrame。通过最小化和恢复窗口,您将强制 JVM 重新绘制,从而获得正确的输出。它会抛出任何异常吗?
  • @Blip 不,系统级别没有任何异常。有没有我们可以在JVM级别记录文件的地方。检查 JVM 是否无法绘制/重绘 Jframe。
  • 您是否尝试从命令提示符运行?
  • @Blip 这是一个 Java Swing 项目,不知道如何在 CMD 中运行它。当我运行主类时,它显示错误,因为找不到我在主类中定义的其他类。

标签: java swing java-8 frame


【解决方案1】:

我猜这是一个死锁问题我遇到了类似的 GUI 冻结与 Swing 的问题。什么都没解决,所以我不得不深入研究 Swing 的代码,我发现了一些非常糟糕的代码,它们导致了死锁,即使在线程转储中也很难追踪。 您可以尝试这些工具并检查死锁 http://docs.oracle.com/javase/7/docs/technotes/guides/management/jconsole.html https://docs.oracle.com/javase/8/docs/technotes/tools/windows/jvisualvm.html

您可以使用这些工具搜索如何识别死锁

此外,您在框架中添加选项卡的方式不是正确的方式,您应该使用 frame.getContentPane().add(tab, BorderLayout.SOUTH)

【讨论】:

  • 未检测到死锁。我已经用屏幕截图编辑了我的问题
  • 好像你正在使用 jconsole ,死锁检查并不能很好地工作。尝试 jvisualvm 并检查其 Tread 选项卡中的线程,看看是否可以得出一些结论。没有必要,它的死锁可能是其他问题。还要确保在 SwingUtilities.invokeLater 线程中执行修改
【解决方案2】:

如果不是所有 Swing 组件都是在事件调度线程 (EDT) 上创建的,我也看到过类似的问题。

绝对确保即使是您最初的 JFrame 也是从 EDT 创建/显示的:

  public class HelloWorldSwing {

    private static void createAndShowGUI() {
      JFrame frame = new JFrame("Hello Swing");

      // Your init code here...

      frame.setVisible(true);
    }

  public static void main(String[] args) {
    // Schedule creation of UI on the EDT
    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
          createAndShowGUI();
        }
    });
  }
}

【讨论】:

    猜你喜欢
    • 2012-06-26
    • 2011-12-25
    • 1970-01-01
    • 2012-07-21
    • 1970-01-01
    • 2012-09-25
    • 2015-11-17
    相关资源
    最近更新 更多