JLayeredPane与Container分层

Gil*_*ili 7 java swing

JLayeredPane允许使用JLayeredPane.add(Component,Integer)将多个组件堆叠在一起.较高"层"中的组件显示在较低"层"中的组件顶部.

Container.add(Component,int)提供了一种类似的机制,其中具有较低索引的组件显示在具有较高索引的组件之上.

请注意,第一种机制使用Integer,第二种机制使用int.另外,一个在低值之上呈现高值,而另一个则相反.不要混两个:)

我的问题是:当Container已经提供相同的机制时,使用JLayeredPane有什么意义?一层组件比另一层好吗?

更新:还要考虑Container.setComponentZOrder(Component,int).

Gil*_*ili 6

回答我自己的问题:

Container.add(Component,int)Container.setComponentZOrder(Component,int)实际上是相同的.前者调用removeNotify()而后者不调用(出于性能原因).

容器分层仅在JComponent.isOptimizedDrawingEnabled()返回false时有效.一个恰好发生错误的实现是......你猜对了:JLayeredPane

不鼓励使用容器分层,因为它可能会产生意外的副作用.

最后,值得注意的是,当Container声明add(Component,int)时,它实际上并没有正确地绘制分层组件.JComponent及其子类可以.

另一个有趣的发现:永远不要在JLayeredPane的子节点上调用repaint().这将导致组件无论其z顺序如何都在顶部绘制.您应该只在JLayeredPane本身上调用repaint().