JLayeredPane允许使用JLayeredPane.add(Component,Integer)将多个组件堆叠在一起.较高"层"中的组件显示在较低"层"中的组件顶部.
Container.add(Component,int)提供了一种类似的机制,其中具有较低索引的组件显示在具有较高索引的组件之上.
请注意,第一种机制使用Integer,第二种机制使用int.另外,一个在低值之上呈现高值,而另一个则相反.不要混两个:)
我的问题是:当Container已经提供相同的机制时,使用JLayeredPane有什么意义?一层组件比另一层好吗?
回答我自己的问题:
Container.add(Component,int)和Container.setComponentZOrder(Component,int)实际上是相同的.前者调用removeNotify()而后者不调用(出于性能原因).
容器分层仅在JComponent.isOptimizedDrawingEnabled()返回false时有效.一个恰好发生错误的实现是......你猜对了:JLayeredPane
不鼓励使用容器分层,因为它可能会产生意外的副作用.
最后,值得注意的是,当Container声明add(Component,int)时,它实际上并没有正确地绘制分层组件.JComponent及其子类可以.
另一个有趣的发现:永远不要在JLayeredPane的子节点上调用repaint().这将导致组件无论其z顺序如何都在顶部绘制.您应该只在JLayeredPane本身上调用repaint().