2012-08-28 41 views
5

我正在使用實現TableCellRenderer的自定義單元格渲染器,併爲每行顯示JTextArea(而不是JLabel)。我基本上覆蓋getTableCellRendererComponent(...)方法與我的每行進行一些額外的計算。這些計算必須在每次表更新時進行一次。由於每次移動鼠標都會調用getTableCellRendererComponent方法,因此會發生滯後。所以我想我應該防止調用getTableCellRendererComponent來避免滯後。減少getTableCellRendererComponent調用的次數

考慮:

1)我的表只有1列,並沒有報頭。

2)我的數據是靜態的,通過實現AbstractTableModel的自定義表模型類中的getValueAt(int row,int column)方法從ArrayList中讀取。

3)我不需要監視鼠標移動事件。

4)我不期望太多的數據,所以我可能想要一次顯示整個表格或完全緩存它。

5)大多數延遲是由於每次從getTableCellRendererComponent返回時設置文本引起的,因爲某些行正在使用從右到左的字符,而RTL文本需要額外的時間才能呈現。

+1

只是爲了強調@Robin的答案:從來沒有在getXXRendererComponent中做過任何計算。通話頻率很高,完全不受您的控制。 – kleopatra

+0

@kleopatra k明白了。但是,我如何控制內部操作呢?像setText和setFont方法一樣,我在getCellRendererComponent方法中使用(用於我的JTextArea單元格)。 –

+0

配置_renderer_很好..聽起來我誤解了你的意思是「計算」。時間爲SSCEE(或至少是渲染器的代碼:-) – kleopatra

回答

7

不要試圖限制呼叫號碼getTableCellRendererComponent。相反,通過緩存計算結果來更好地實現渲染器。

您可以輕鬆地將監聽器添加到tablemodel,以便渲染器知道何時更新模型。只有這樣,它才能標記存儲的計算結果無效,並在下一個getTableCellRendererComponent調用中重新計算它們。