有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

JavaSwingGUI在Java1.8更新后不刷新或冻结

我有一个运行良好的应用程序,它在Java1.6和1.7甚至1.8更新31中运行良好。我刚刚更新了Java today 1.8 update 45,发现我的应用程序接口有问题。例如: enter image description here 这是我的工作应用程序屏幕。这是它应该是的,但在更新后它会变成这样(如下所示): enter image description here 一旦我得到无法正常工作的界面,我需要点击该区域,或者我需要最小化应用程序并再次打开以恢复正常

代码

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();
}

以上代码用于在选项卡之间切换。任何建议或参考链接都将不胜感激。 编辑
死锁 enter image description here


共 (2) 个答案

  1. # 1 楼答案

    我猜这是一个死锁的问题,我在Swing中也遇到了类似的GUI冻结问题。没有结果,所以我不得不深入研究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中添加tab的方式不是使用frame添加tab的正确方式。getContentPane()。添加(选项卡,BorderLayout.SOUTH)

  2. # 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();
            }
        });
      }
    }