2012-07-20 142 views
2

我正在更新/维护现有的图形程序。这被认为是一个中等程度的程序(能够处理少于一百万个节点+它们的转换)。在图形用户界面中,有一个可视化显示图形的“视口”,并且有一个侧面板,其中包含包含节点摘要,转场等的选项卡...java.awt.container.add(comp)瓶颈

图形部分工作现象,速度很快但运行分析器(YourKit)后,96-99.8%的时间用于创建节点的摘要选项卡/表格。因此,对于10,000个节点,需要一两秒的时间来生成可视化的图形,但需要几分钟才能填充表格!

该过程的摘要是:选项卡得到通知,模型已更改并获取节点列表。如果它需要更多的行,它会添加它们,否则会重新使用或丢弃旧的行。然后在创建行和它们的单元格之后,它将填充它们。

人口是每行一个节点,每行三个单元(JPanel)(每个包含一些信息)。每当添加新行或者要求检查更新时创建单元格时,它会调用下面提供的“positionPanel”方法。布局管理器是SpringLayout。据分析人士介绍,产生该表的90%的百分之九十一减一是“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

为什么不使用'JTable'? – tenorsax 2012-07-21 03:41:57

+0

用于分析。 – trashgod 2012-07-21 04:15:42

+0

@ Max这个课程是根据它的文档在2006年7月18日提出的。他们有自己制作桌子的理由,我想他们可以有复选框。我将运行基准测试来了解JTable如何处理负载,可能会改变为此。 – Lan 2012-07-23 02:49:43

回答

3

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

+0

参见'JHotDraw',引用[here](http://stackoverflow.com/q/13312223/230513)。 – trashgod 2012-12-02 16:41:01