Java 优化jtable

Java 优化jtable,java,swing,paint,graphics2d,tablecellrenderer,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

我用一个
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()
等。将大多数方法替换为空方法以提高性能。我也这样做了,这确实有帮助,但问题的大部分还是留在那里。这个
paint()
方法不断地消耗着我至少10%的CPU,整个应用程序的速度严重降低。有什么想法吗?

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

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

需要注意的是,
GetTableCellRenderComponent()

  • 通常返回对自身的引用
  • 应该而不是在每次完全出于性能原因调用时创建一个新对象
  • 充当橡皮戳,一次渲染一个所有单元格
  • 使用优化对象(对于DefaultTableCellRenderer,使用修改的
    JLabel
    )进行绘制、重新验证和重新绘制

  • 尝试使用探查器将您现有的实现与此实现进行比较,以使自己确信,它生成的绘图和布局事件要少得多,CPU利用率也更好。

    代码会有所帮助。为什么要覆盖渲染器的绘制方法?请注意,很少建议重写paint,而建议重写paintComponent,尽管这可能无助于解决问题。您的显示是否可以在没有任何覆盖的情况下解决?请告诉我们并向我们展示更多。最好是你能创建并发布一个最小的可运行程序,直接向我们展示你的问题。这不是完整的代码转储,不应发布到链接。请阅读上面的链接了解更多信息。“…有点重…”你的意思是该应用程序。明显变慢,或者分析工具表明这是应用程序中的瓶颈。?TableCellRenderer从所有鼠标、键、模型和侦听器事件和相关API中实现的方法调用,您问题中描述的所有内容都可以是标准输出,其余的在前面的注释中…
    用空方法替换它们中的大多数以提高性能。我也这样做了,它确实有帮助,
    为什么不扩展默认渲染器,而不是尝试模仿默认渲染器的功能呢。仍然可以重写paint()方法。虽然自定义绘制应该通过重写paintComponent()方法而不是paint()来完成。谢谢您的提示,但实际上我需要的是自定义
    paint()
    。。。