有没有办法只将特定的JPanel区域标记为不透明?

时间:2011-11-17 23:00:34

标签: java swing jpanel repaint dirtyrectangle

基本上我正在绘制很多透明的JPanels;分析显示大部分时间都花在Component.paint()上。因为在大多数情况下,每个JPanel的实际非不透明区域非常小,例如在边缘附近,所以可以非常彻底地优化它。

就目前而言,重新绘制()一个组件会触发重新绘制所有其父项,因为RepaintManager无法知道脏父区域实际上是不透明的并且会向上移动组件层次结构。我想在面板无效时给所有父母打电话markCompletelyClean(),并用addDirtyRegion()自己管理脏区。

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

3 个答案:

答案 0 :(得分:2)

即使你使用markCompletelyClean()和addDirtyRegion()做了一些奇特的事情,我怀疑你会获得很多性能上的好处。当swing进行重绘时,它会整理所有脏区域以进行绘制,并使用所有脏区域的最小边界框重新开始重绘。因此,如果您将JPanel的边界标记为脏,那么JPanel的边界框与整个JPanel相同,这意味着您将以任何方式重新绘制整个内容。

答案 1 :(得分:2)

考虑使用JLabel(默认情况下为非透明)代替JPanel,然后您可以(到JLabel)添加任何JComponent相同的JPanel LayoutManager,但您必须设置Opacity/Transparency,然后您忘记关注{{1}}以及详细信息区域

答案 2 :(得分:1)

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

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

所有边界?

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