2014-10-18 33 views
1

我有一个Swing应用程序来创建RPG字符。 它有一个嵌套JTabbedPane的体系结构,因此有一个HeroTabsPanel具有HeroPanels并且每个那些具有一些更多的标签等的统计资料,物品等在基于JTabbedPane的Swing应用程序中导致性能下降的原因是什么?

所以GUI由上部的选项卡式窗格的英雄,当前英雄标签的下部分页窗格和当选择标签时显示对应于每个标签的EditViewPanel

从一开始就表现糟糕,但是当我添加上层的英雄标签(让多个英雄同时编辑)时,标签之间的切换变得更慢。 需要几分钟以在所有代码完成添加组件后显示新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的一些提示/例子。

我可以添加更多的代码,如果你有一些大概的问题可能隐藏的问题。

欢迎任何建议,谢谢!

回答

1

好吧,我终于通过美国东部时间转储完成了。由于布局,冻结,似乎不太可能。 MigLayout试图在每次选择新选项卡时找出所有组件的大小,并且可能针对init上所有选项卡中的所有组件。 解决方案是简单地覆盖getPreferredSize()JTabbedPanel的实现。 @Robin,感谢您的线程转储提示!

3

我从来没有遇到一个Swing UI,由于可见的JComponent的数量很慢。我经常看到的是一个缓慢的用户界面,因为用户界面线程被用来执行各种与用户界面更新无关的工作。

在Swing中,只有一个线程可以在其上更新UI,并且该线程负责绘制UI(Event Dispatch Thread)。如果你通过例如阻止该线程对其进行计算,在计算运行时,用户界面将无法重新绘制或对用户输入做出反应。这就是为什么你必须执行工作线程所有繁重的工作。这在Concurrency in Swing教程中有明确的解释。

不是100%确定这是发生在你的情况,但它绝对听起来像它。如果您想确定,请在您等待用户界面时进行线程转储,并查看当时名为AWT-EventQueue-0的线程在做什么。如果确实需要5分钟才能更新UI,则必须能够快速找到阻碍UI的内容。

+0

在eclipse调试程序中,如何获取线程转储以及如何分析它?抱歉,找不到有用的东西。 就像我说过的,所有的代码都在运行,所以我没有在调试器中看到任何东西。这个线程似乎还没有做任何事情,但是GUI被冻结了吗? – 2014-10-20 08:01:56

+0

如果UI被冻结,您可能会发生死锁或仍在运行。我不使用Eclipse,所以不知道如何获得线程转储。 – Robin 2014-10-20 13:37:55

相关问题