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