在Swing中使用大型自定义组件时,如何有效地重新绘制?

iva*_*off 5 java graphics optimization user-interface swing

我创建了一个自定义组件(派生自JComponent),它代表了一个可拖动的Bezier曲线.
(看起来像挂电缆,有人可能从Bender或Cubase知道它)

我的问题是:曲线可能变得非常长,让我们说从桌面的左上角到右下角.

这使得Swing的重绘功能效率低下:曲线的面积可能只有几百个像素,但是组件的面积(大部分是"透明的")是数百万像素的大.

我的主观印象是:
曲线越长,拖动时的闪烁就越多.

我希望我能清楚地说明这个问题.

也许当我以某种方式可以自己选择时,它会有所帮助 ,该组件的哪些区域需要重新绘制.

编辑:
这么乱!我正在使用Netbeans分析应用程序,这有助于正常找到低效的代码,但是这个Swing框架正在进行数百次嵌套调用!我只是想不通,什么是缓慢的,为什么.
顺便说一句,禁用super.paint(...)super.paintComponent(...)没有帮助.

wir*_*res 1

您可以使用以下命令重绘屏幕的一小部分repaint(Rectangle r)

http://java.sun.com/j2se/1.4.2/docs/api/javax/swing/JComponent.html#repaint(java.awt.Rectangle)

然后你提到了闪烁。由于您使用的是 Swing,它使用双缓冲,因此您的闪烁一定来自其他原因。您正在清除屏幕吗paintComponent(...)?即打电话给fillRect(...)?不要这样做,不需要(IIRC)。