java - 优化 jtable

标签 java swing paint graphics2d tablecellrenderer

我用 JLabel 创建了一个 TableCellRenderer,其 paint() 有点重,主要是因为 g2d .drawString() 给出一个 utf 字符串。问题是这个 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   
....

如何防止这种重复过程?我检查了 DefaultTableCellRenderer 实现,发现它们重写了许多方法,例如 repaint()revalidate() 等.用空方法替换大部分以提高性能。我也这样做了,它确实有帮助,但问题的大部分在于留在那里。我的 CPU 至少大约 10% 一直被这个 paint() 方法消耗,整个应用程序的速度严重减慢。有什么想法吗?

最佳答案

要了解为什么 Paint 方法被过度调用,您可以从检查 DefaultTableCellRenderer 开始JavaDoc。
您还需要了解 Swing 绘图机制以及重新验证的工作原理。
您可以阅读有关 AWT 和 Swing 中绘画的信息 here .

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

值得注意的是getTableCellRendererComponent():

  1. 通常返回对其自身的引用。
  2. 出于性能原因,不应该每次调用时都创建一个新对象。
  3. 充当橡皮图章,一次渲染所有单元格。
  4. 使用优化的对象(在 DefaultTableCellRenderer 的情况下经过修改的 JLabel)进行绘制、重新验证和重新绘制。

尝试使用分析器比较您的现有实现和此实现,以说服自己它产生的绘图和布局事件要少得多,并且 CPU 利用率更高。

关于java - 优化 jtable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34158563/

相关文章:

java - 单击 JTextField 是否调用 actionPerformed 方法

java - 使用绘制方法时的嵌套循环,无法弄清楚如何正确设置它

java - 使用 Java 从 XML 文件创建图形图像(png、jpg ..)

java - Apache ·奥林戈·波约根

JavaFX 将超链接绑定(bind)到标签

android - 在 Android 4.0.3 的 Canvas 上绘制奇怪的崩溃。 A/libc : Fatal signal 11 (SIGSEGV)

ArrayList 中的 java.util.ConcurrentModificationException;尝试在绘画时添加新对象

java - 如何返回没有多余字符串的字符串

java - 如何使我的交换机保护套在JFrame上起作用?

java - JFrame 第一次调用后显示为空白