Java 是什么导致我的基于JTabbedPane的Swing应用程序性能低下?

Java 是什么导致我的基于JTabbedPane的Swing应用程序性能低下?,java,performance,swing,jtabbedpane,miglayout,Java,Performance,Swing,Jtabbedpane,Miglayout,我有一个用于创建RPG角色的Swing应用程序。 它有一个嵌套的JTabbedPane架构,所以有一个HeroTabsPanel,它有HeroPanel,每个面板都有一些更多的选项卡,比如Stats、Items等 因此,GUI由用于英雄的上选项卡式窗格、用于当前英雄选项卡的下选项卡式窗格和EditViewPanel组成,当选择选项卡时,EditViewPanel会显示对应于每个选项卡的EditingView 从一开始性能就很差,但当我添加了更高级别的英雄标签(同时编辑多个英雄)时,在标签之间切换

我有一个用于创建RPG角色的Swing应用程序。 它有一个嵌套的JTabbedPane架构,所以有一个HeroTabsPanel,它有HeroPanel,每个面板都有一些更多的选项卡,比如Stats、Items等

因此,GUI由用于英雄的上选项卡式窗格、用于当前英雄选项卡的下选项卡式窗格和EditViewPanel组成,当选择选项卡时,EditViewPanel会显示对应于每个选项卡的EditingView

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

我使用的是带有绝对定位的MIG布局。实际上,在我添加上面的选项卡之前,曾经有过一些“绝对链接值中的不稳定循环依赖性”问题,但现在不知何故没有了

在stateChanged()中,我有以下内容:

editViewPanel.activateView(currentTab.getLinkedView());
在activateView()中:

但正如我所说,所有代码的执行都在合理的时间内完成,我已经完成了评测,但是在评测完成后,会有相当长的延迟,在第一次添加到新JFrame的情况下,会延迟几分钟

另一个问题是,当我需要更新下tabbedpane中的面板时,尤其是StatsPanel,它是由在几列中为每个参数添加的string int元素组成的,我会得到另一个很大的延迟。它还取决于MIG布局,并且由于某种原因(我知道设计不好)也有绝对定位。但是我修改了它,这样初始化后就不会删除/添加任何组件,只使用setText(),代码执行完毕后仍然会有很大的延迟

我计划使用SwingWorkers,但我想在开始解决问题之前更好地理解这个问题。我怀疑这很简单,但我有点怀疑它造成的延迟有多大。我希望你能给我一些关于SwingWorkers的提示/例子

如果您对问题可能隐藏的地方有一些大致的了解,我可以添加更多代码


欢迎任何建议,谢谢

我从来没有遇到过Swing UI速度慢的问题,因为可以看到
JComponent
s的数量。我经常看到的是一个缓慢的UI,因为UI线程被用来/滥用来执行与UI更新无关的所有工作

在Swing中,只有一个线程可以更新UI,该线程负责绘制UI(事件调度线程)。如果您通过(例如)对该线程执行计算来阻止该线程,则在计算运行时,UI将无法重新绘制或对用户输入作出反应。这就是为什么必须在辅助线程上执行所有繁重的工作。这在教程中有明确的解释


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

好的,我通过EDT转储最终解决了这个问题。冻结是由于布局,虽然看起来不太可能。 MigLayout试图在每次选择新选项卡时计算出所有组件的大小,可能是init上所有选项卡中的所有组件的大小。 解决方案只是覆盖JTabbedPanel实现的getPreferredSize()。
@罗宾,谢谢你的线程转储提示

在eclipse调试器中,如何获取线程转储以及如何分析它?抱歉,尚未找到任何有用的内容。就像我说的,所有代码都在运行,所以我在调试器中看不到任何其他内容。为什么线程看起来什么都不做,而GUI却被冻结了?如果UI被冻结,则可能是死锁或者它仍在运行。我不使用Eclipse,因此不知道如何在那里获得线程转储。
removeAll();
currentView = heroView;
add(currentView, "pos 0 0");
currentView.refresh();
revalidate();