java.awt.container.add(comp)瓶颈

时间:2012-07-20 15:48:38

标签: java performance swing user-interface containers

我正在更新/维护现有的图表程序。这被认为是一个中型程序(能够处理少于一百万个节点及其转换的任何东西)。在GUI中,有一个“视口”可视化地显示图形,并且有一个侧面板,其中包含包含节点,转换等摘要的选项卡...

图形部分工作原理很快,但是在运行探查器(YourKit)之后,96-99.8%的时间用于创建节点的摘要选项卡/表。因此,对于10,000个节点,需要一两秒才能直观地生成图形,但需要几分钟来填充表格!

流程摘要如下:选项卡会收到模型更改通知并获取节点列表。如果它需要更多行,它会添加它们,否则它会重用或抛弃旧行。然后在创建行及其单元格后,它会填充它们。

总体是每行一个节点,每行三个单元格(JPanel)(每个包含一些信息)。每次添加新行或要求行检查更新时都会创建单元格,它会调用下面提供的“positionPanel”方法。布局管理器是SpringLayout。根据分析器,生成此表的90%以上,90%减去1是“add(newPanel);”线。

有关速度在哪里以及如何改进的任何建议?

private void positionPanel(int row, int col) {

      JPanel upPanel = this;
      JPanel leftPanel = this;
      String upSpring = SpringLayout.NORTH;
      String leftSpring = SpringLayout.WEST;
      if (row != 0) {
        upPanel = cells.get(row - 1)[col];
        upSpring = SpringLayout.SOUTH;
      }
      if (col != 0) {
        leftPanel = cells.get(row)[col-1];
        leftSpring = SpringLayout.EAST;
      }
      Cell newPanel = cells.get(row)[col];
      //cells.get(row).set(col, newPanel);
      add(newPanel);
      layout.putConstraint(SpringLayout.NORTH, newPanel, cellSpacing, upSpring, upPanel);
      layout.putConstraint(SpringLayout.WEST, newPanel, cellSpacing, leftSpring, leftPanel); 
}

1 个答案:

答案 0 :(得分:3)

考虑JTable的建议取决于使用flyweight pattern来实施rendering。好处来自于仅渲染可见/已更改的节点,而忽略其他节点。 JGraph使用了类似的方法。概述了基本机制here。请注意,该优势仅适用于视图,但您的分析表明它可能是值得的。