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

标签 java performance swing jtabbedpane miglayout

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

因此 GUI 由上部英雄选项卡式 Pane 、当前英雄选项卡下部选项卡式 Pane 和一个 EditViewPanel 组成,该面板显示与每个选项卡对应的 EditingView选项卡被选中。

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

我正在使用具有绝对定位功能的 MigLayout。实际上,在我添加上层选项卡之前,存在一些“绝对链接值中的不稳定循环依赖!” 问题,但现在不知何故没有了。

stateChanged() 我有这样的东西:

editViewPanel.activateView(currentTab.getLinkedView());

activateView() 中:

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

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

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

我打算使用 SwingWorkers,但我想在开始解决问题之前更好地理解问题。我怀疑这很简单,但我有点怀疑它造成的延迟有多大。我会很感激关于 SwingWorkers 的一些提示/示例。

如果您对问题可能隐藏的位置有大致的了解,我可以添加更多代码。

欢迎提出建议,谢谢!

最佳答案

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

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

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

关于java - 是什么导致基于 JTabbedPane 的 Swing 应用程序性能下降?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26441804/

相关文章:

java - Tomcat 不拾取类文件 - 不显示 JSP 文件

performance - 关于加速 Drupal 站点的提示

java - 在 Java 中加载静态编译的库

java - 什么会导致 getClass() != obj.getClass() 在相​​同对象上不相等

ruby-on-rails - Rails3 : Should I switch to NoSQL? 大量计算,大量用户匹配数据

performance - GHC forkIO 双峰性能

java - JComboBox 和 JButton 问题

java - Swing 布局 - 在保持组件尺寸的同时使用网格

java - 将数据加载到组合框

java - eclipse servlet java.lang.ClassNotFoundException : javax. servlet.Servlet