优化jtable

时间:2015-12-08 14:34:46

标签: java swing paint graphics2d tablecellrenderer

我已经TableCellRenderer JLabel创建了paint() g2d.drawString()paint()有点沉重,主要是因为MultiTableCellRenderer$TableHeaderLabel.paint:235 CellRendererPane.paintComponent:151 BasicTableUI.paintCell:2115 BasicTableUI.paintCells:2016 BasicTableUI.paint:1812 ComponentUI.update:161 JComponent.paintComponent:780 JComponent.paint:1056 JComponent.paintChildren:889 JComponent.paint:1065 JViewport.paint:728 JComponent.paintChildren:889 JComponent.paint:1065 JComponent.paintChildren:889 JComponent.paint:1065 JComponent.paintChildren:889 JComponent.paint:1065 JComponent.paintChildren:889 JSplitPane.paintChildren:1047 JComponent.paint:1065 JComponent.paintToOffscreen:5219 RepaintManager$PaintManager.paintDoubleBuffered:1572 RepaintManager$PaintManager.paint:1495 RepaintManager.paint:1265 JComponent._paintImmediately:5167 JComponent.paintImmediately:4978 RepaintManager$4.run:824 RepaintManager$4.run:807 AccessController.doPrivileged .... 被赋予了utf字符串。问题是在下面的堆栈中非常重复地调用DefaultTableCellRenderer

repaint()

如何防止这种重复过程?我已经检查了revalidate()实现,并发现它们已经覆盖了许多方法,例如paint()myRichTextBox.Select(0, myRichTextBox.GetFirstCharIndexFromLine(1)); myRichTextBox.SelectedText = ""; 等等。用空方法替换大多数方法以提高性能。我也这样做了,它确实有所帮助,但问题的大部分仍然存在。这个非常503的方法至少有大约10%的CPU被消耗,并且整个应用程序已经严重减慢了。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

要理解为什么过度调用paint方法,可以先查看DefaultTableCellRenderer JavaDoc。 您还需要了解Swing绘图机制以及重新验证的工作原理 你可以在AWT和Swing here中阅读有关绘画的内容。

简单而有效(性能方面和代码方面)的经验法则是扩展DefaultTableCellRenderer并根据您的需要对其进行自定义。
通常通过覆盖setValue()getTableCellRendererComponent()来完成自定义。

值得注意的是getTableCellRendererComponent()

  1. 通常会返回对自身的引用。
  2. 每次完全出于性能原因调用时,都应该创建一个新对象。
  3. 充当橡皮图章,一次渲染一个所有单元格。
  4. 使用优化的对象(在DefaultTableCellRenderer的情况下修改JLabel)进行绘图,重新验证和重新绘制。
  5. 尝试使用分析器比较您现有的实现和此实现,以说服自己产生更少的绘图和布局事件以及更好的CPU利用率。