Java中Panel的叠放次序如何调整

今天在一个程序中想要实现点击按钮在原有panel上显示另一个panel出现了问题。于是有了以下思考

1.panel在frame中到底是怎么叠放的(如果涉及到重叠的时候)

2.其他的组件是根据什么来体现层序的。

3.如何在frame中或者说在其他容器中实现一个panel显示在另一个panel上。

这里我们先解答今天的问题,首先我的代码想要实现的是下面这种效果。
Java中Panel的叠放次序如何调整
Java中Panel的叠放次序如何调整
我的思路是监听按钮,在点击按钮之后执行在我的主面板中添加这个panel的代码,当然点击一次出现再点击是需要收起来的。实现代码如下图所示:
Java中Panel的叠放次序如何调整
主要代码就是:
mainpanel.add(hisGo.history,1);//这个参数起到了至关重要的作用。

如此我发现,在向我的主面板添加这个panel的时候,只有在后面加一个参数,就能实现我的需求,这里也就是让这个叫history的panel放在之前设置好的keyboard panel上。之后通过测试发现参数的有效范围在-1到2之间(int类型),填100,3,-2都会报错;填写0或1,都达到目的了。填写-1或2,出现了下面的情况:

Java中Panel的叠放次序如何调整
这里我们就暂且吧add()方法中这参数的含义放一下。在没解决这个问题的时候,我在搜索引擎发现最多的解决这个问题的方法是使用JLayeredPane,也就是层级面板。这里发现了一篇博文可以说写的很详细了。大家可以参考:JavaSwing_3.5: JLayeredPane(层级面板)http://blog.csdn.net/xietansheng/article/details/74366560
但是因为之前用的都是JPanel,这里实在懒得改了,所以就开始思考如何在JPanel中直接实现,首先可以确定的是,先添加进去的组件就会出现在最上面,但是我这里没有办法让这个panel优先于keyboard添加到mainpanel中,所以只能另想出路。大家都应该知道Java有一个特点,同一个API方法可以填写很多个参数。想到这点我就想试试add()这个方法后面除了填写要添加的组件名称和布局方法之外还可以填写什么,果然让我发现了这个index参数。那么我们这里可以看到,这个参数就是用来设置位置的。如下图所示:
Java中Panel的叠放次序如何调整

那这个时候就需要注意了,这个位置是绝对位置还是相对位置呢?

可以这样讲,如果在同一个panel中添加组件,填写参数0可以保证组件在最上面,当然如果两个组件设置的参数都为0,目前来看是后添加的那个组件在上,但如果都不设置参数,那么先添加的参数在上。具体情况还是要参考API。