什么导致基于JTabbedPane的Swing应用程序性能下降?

时间:2014-10-18 16:09:41

标签: java performance swing jtabbedpane miglayout

我有一个用于创建RPG角色的Swing应用程序。 它有一个嵌套的JTabbedPane架构,所以有一个 HeroTabsPanel ,它有 HeroPanels ,每个都有一些标签,如Stats,Items等。

因此,GUI由英雄的上方选项卡式窗格,当前英雄选项卡的下方选项卡式窗格和 EditViewPanel 组成,后者显示与每个选项卡对应的 EditingView 选项卡已选中。

性能从一开始就很糟糕,但是当我添加上层英雄标签(同时编辑多个英雄)时,标签之间的切换变得更慢。 所有代码完成添加组件后,在新JFrame中显示的内容需要几分钟。这可能是布局吗?

我使用 MigLayout 进行绝对定位。实际上,在我添加上标签之前,已经存在一些“绝对链接值中的不稳定循环依赖关系!”问题,但现在还没有某种方式。

stateChanged()中我有相应的内容:

editViewPanel.activateView(currentTab.getLinkedView());

activateView()

removeAll();
currentView = heroView;
add(currentView, "pos 0 0");
currentView.refresh();
revalidate();

但就像我说的那样,所有的代码执行都是在合理的时间内完成的,我已经完成了我的分析,但是在完成之后,有一个相当长的延迟,在第一次的情况下长达几分钟时间添加到新的JFrame。

另一个问题是,当我需要更新下方tabbedpane中的面板时,尤其是StatsPanel,它是由为几列中的每个参数添加的string-int元素组成的,我得到了另一个大的延迟。它还取决于MigLayout,由于某种原因(我知道糟糕的设计)也具有绝对定位。但是我已经改变它,以便在初始化之后没有组件被删除/添加,只使用了setText(),并且在代码完成执行后仍然有很大的延迟。

我打算使用SwingWorkers但我想在开始解决之前更好地理解这个问题。我怀疑它很简单,但我对它造成的延误有多大感到不安。我很欣赏SwingWorkers的一些提示/示例。

如果您对问题可能隐藏的地方有一些概括,我可以添加更多代码。

欢迎任何建议,谢谢!

2 个答案:

答案 0 :(得分:3)

由于JComponent的数量可见,我从未遇到过缓慢的Swing UI。我经常看到的是一个缓慢的UI,因为使用/滥用UI线程来执行与UI更新无关的各种工作。

在Swing中,只有一个线程可以在其上更新UI,同一个线程负责绘制UI(事件调度线程)。如果您通过例如阻止此线程对其执行计算时,UI将无法在计算运行时重新绘制或响应用户输入。这就是必须在工作线程上执行所有繁重工作的原因。 Concurrency in Swing教程中清楚地解释了这一点。

不是100%肯定这是你的情况发生的事情,但它听起来确实如此。如果您想确定,请在等待UI时进行线程转储,并查看当时名为AWT-EventQueue-0的线程正在执行的操作。如果在更新UI之前确实需要5分钟,那么您必须能够非常快速地找到阻止UI的内容。

答案 1 :(得分:2)

好的,我终于通过EDT转储解决了问题。由于布局,冻结,虽然看起来不太可能。 每次选择新选项卡时,MigLayout都会尝试计算所有组件的大小,并且可能是init上所有选项卡中的所有组件。 该解决方案只是为 JTabbedPanel 实现覆盖 getPreferredSize()。 @Robin,感谢线程转储提示!