Swing重叠组件

时间:2009-09-15 16:23:37

标签: java swing layout

我在Frame,Panel A和Panel B中有两个AWT组件。我希望面板A的大小适合框架的高度宽度(并保持框架大小的大小),但我希望面板B能够重叠A. B将处于固定位置(0,0使其更容易),具有固定的高度和宽度。我不确定我需要什么样的布局管理器来完成这项工作。如果我使用null布局,我想我必须自己管理面板A的大小调整,但它会使面板B的大小相对容易。有关如何实现这一点的任何想法?

感谢, 杰夫

3 个答案:

答案 0 :(得分:10)

看看JLayeredPanesHere is a tutorial

编辑:

如果panelA是AWT组件,您将很难让panelB重叠。来自Sun的文章Mixing Heavy and Light Components

  

不要在轻量级组件与重量级组件重叠的容器中混合轻量级(Swing)和重量级(AWT)组件。

但是,如果您希望panelA完全填充Frame,为什么不将panelB添加为panelA的组件?

EDIT2:

如果您可以将panelB设为重量级组件,则可以使用JLayeredPane

这是一个快速模型,展示了如何:

public static void main(String[] args){
    new GUITest();
}

public GUITest() {
    frame = new JFrame("test");
    frame.setSize(300,300);
    addStuffToFrame();
    SwingUtilities.invokeLater(new Runnable(){
        public void run() {
            frame.setVisible(true);
        }
    });

}       

private void addStuffToFrame() {    
    Panel awtPanel = new Panel();
    awtPanel.setBackground(Color.blue);
    //here you can fool around with the pane:
    //first, you can see how the layered pane works by switching the 
    //DEFUALT_LAYER and PALLETTE_LAYER back and forth between the two panels
    //and re-compiling to see the results
    awtPanel.setSize(200,300);
    frame.getLayeredPane().add(awtPanel, JLayeredPane.DEFAULT_LAYER);
    //next you comment out the above two lines and 
    //uncomment the following line. this will give you the desired effect of
    //awtPanel filling in the entire frame, even on a resize. 
    //frame.add(awtPanel);

    Panel awtPanel2 = new Panel();
    awtPanel2.setBackground(Color.red);
    awtPanel2.setSize(300,200);
    frame.getLayeredPane().add(awtPanel2,JLayeredPane.PALETTE_LAYER);
}   

答案 1 :(得分:1)

您最好的选择是拥有自己的LayoutManager。最简单的方法可能是扩展或代理BorderLayout,并具有布局面板B的特定情况。

答案 2 :(得分:0)

也许我错过了什么。如果B是固定大小并且在(0,0)并且A运行全宽,那么使用B重叠A是什么用途?你永远不会看到放在B下的任何东西。

我想不出任何默认的布局管理器,但Orielly有这个你可以使用的: 使用relative layout manager documentation(请参阅源代码链接)。我很久没有使用它,但它应该自己管理布局。