JavaSwingGUI在Java1.8更新后不刷新或冻结
我有一个运行良好的应用程序,它在Java1.6和1.7甚至1.8更新31中运行良好。我刚刚更新了Java today 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();
}
以上代码用于在选项卡之间切换。任何建议或参考链接都将不胜感激。
编辑
死锁
# 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 楼答案
如果不是所有Swing组件都是在事件调度线程(EDT)上创建的,我也看到过类似的问题
确保你的初始
JFrame
是从EDT创建/显示的: