JLayeredPane允许用JLayeredPane.add(Component, Integer)将多个组件堆叠在一起。较高“层”中的组件显示在较低“层”中的组件顶部。
Container.add(Component, int)提供了一种类似的机制,其中具有较低索引的组件显示在具有较高索引的组件之上。
请注意,第一种机制使用整数,第二种机制使用 int 。另外,一个在低值之上呈现高值,而另一个则相反。不要混淆两者:)
我的问题是:当Container已经提供相同的机制时,使用JLayeredPane有什么意义?一层组件比另一层更好吗?
答案 0 :(得分:6)
回答我自己的问题:
Container.add(Component, int)和Container.setComponentZOrder(Component, int)几乎完全相同。前者调用removeNotify()而后者不调用(出于性能原因)。
容器分层仅在JComponent.isOptimizedDrawingEnabled()返回false时有效。一个恰好发生错误的实现就是......你猜对了:JLayeredPane
不鼓励使用容器分层,因为它可以有unexpected side-effects。
最后,值得注意的是,当Container声明add(Component, int)时,它实际上并没有正确地绘制分层组件。 JComponent及其子类。
另一个有趣的发现:永远不要在JLayeredPane的子节点上调用repaint()。这将导致组件无论其z顺序如何都在顶部绘制。您应该只在JLayeredPane本身上调用repaint()。
答案 1 :(得分:0)
我对此的看法是Container.add(Component,int)
和JLayeredPane.add(Component,Integer)
函数设置了在某个索引处添加的组件。然后,布局管理器使用此索引来处理组件绘制的位置,布局和顺序。我认为JLayeredPane.setLayer(Component c, int layer)
更像是你所寻求的层次。它专门用于分层组件。只是我的两个感觉。