4

基本上我画了很多透明的JPanels;分析表明大部分时间都花在了 Component.paint() 中。可以彻底优化这一点,因为在大多数情况下,每个 JPanel 的真正非透明区域非常小,例如在边缘周围。

就目前而言,repainting() 一个组件将触发对其所有父级的重绘,因为 RepaintManager 无法知道脏父级区域实际上是不透明的,并且会在组件层次结构中上升。我正在考虑markCompletelyClean()在面板失效时调用所有父母并自己管理脏区addDirtyRegion()

但是,是否有更简洁的方法仅将 JPanel 的特定矩形标记为不透明(或透明,没关系)?

4

3 回答 3

2

即使您对 markCompletelyClean() 和 addDirtyRegion() 做了一些花哨的事情,我怀疑您是否会获得很多性能优势。当 swing 进行重绘时,它会整理所有脏区域进行绘制,并使用所有脏区域的最小边界框开始重绘。因此,如果您将 JPanel 的周边标记为脏,则 JPanel 的边界框与整个 JPanel 相同,这意味着您将以任何方式重新绘制整个事物。

于 2011-11-17T23:04:00.993 回答
2

考虑使用(non- opaque JLabelby default) 而不是, 然后你JPanel可以 (to the )JLabel你可以添加任何JComponentJPanelLayoutManagerOpacity/Transparency

于 2011-11-17T23:09:32.807 回答
1

为什么不能定义自己的方法myRepaint()调用多个

public void repaint(long tm, int x, int y, int width, int height)

所有的边界?

还可以尝试使用 Graphics 的 clipBounds 来仅重新绘制真正必要的部分。您可以将任何自定义形状设置为剪辑。

于 2011-11-18T05:44:37.477 回答