2012-07-20 126 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