【问题标题】:Minor Refactoring in Java Swing application causes huge slowdownJava Swing 应用程序中的次要重构会导致速度大幅下降
【发布时间】:2011-01-10 16:57:02
【问题描述】:

我的任务是对我们这里的 Java Swing 应用程序进行重构,这非常麻烦。我的工作是清理代码并使其更具动态性,因为我们将在第二个项目中开始使用它,并且它需要能够进行适当的调整。一个窗口的一小部分包含

  • 一个按钮
  • 用于选择日期的 JFormattedTextField。
  • 显示数据的 3X4 JLabel 表。

最初编写此代码的人只是使用 GridBagLayout JPanel,然后对所有内容进行硬编码,包括表的标题和行标签,并在动态数据位置留下空的 JLabel。当收到动态信息时,setText 会使用文本数据调用。我的部分重构将导致整个表格在维度和内容上都是动态的,因此我决定将表格设为具有 GridLayout 的子面板,并使用这段代码动态设置内容和维度:

公共无效updateInfoPanel(ArrayList行){ System.out.println("正在更新信息面板!"); //genericInfo 是有问题的新子面板。 genericInfo.removeAll(); GridLayout 布局 = new GridLayout(); layout.setColumns(rows.get(0).length); layout.setRows(rows.size()); genericInfo.setLayout(布局); for(字符串 [] 行:行){ for(字符串元素:行){ genericInfo.add(新标签(元素)); } } }

我已经证实,每次创建窗口时只会调用一次,但整个窗口现在非常缓慢。响应帧中其他部分的点击可能需要超过 5 秒的时间,而这些点击过去会在几分之一秒内做出响应。有谁知道这会导致什么? GridLayouts 有什么我不明白的地方吗?

【问题讨论】:

  • 问题可能不包含在问题中。尝试过探查器,或者甚至只是jstack,如果它需要这么长时间? (而且你在 AWT EDT 上做所有 Swing 工作,对吗?)
  • 不,我正在使用的代码不会从 EDT 执行任何 GUI 更新,我什至没有意识到这一点。我讨厌那些“这是怎么工作的?”时刻。如果您将此作为答案发布,我会接受它,我认为您领先于发布相同内容作为答案的人。

标签: java swing


【解决方案1】:

尝试在 EDT 上调用此代码。

【讨论】:

    【解决方案2】:

    不,看来您了解 GridLayouts。问题出在其他地方,请查看您可能已更改的其他代码,并进行一些分析以确定减速的真正原因。

    【讨论】:

      猜你喜欢
      • 2018-10-08
      • 1970-01-01
      • 2011-09-10
      • 2016-05-20
      • 1970-01-01
      • 1970-01-01
      • 2014-03-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多