我在Frame,Panel A和Panel B中有两个AWT组件。我希望面板A的大小适合框架的高度宽度(并保持框架大小的大小),但我希望面板B能够重叠A. B将处于固定位置(0,0使其更容易),具有固定的高度和宽度。我不确定我需要什么样的布局管理器来完成这项工作。如果我使用null布局,我想我必须自己管理面板A的大小调整,但它会使面板B的大小相对容易。有关如何实现这一点的任何想法?
感谢, 杰夫
答案 0 :(得分:10)
看看JLayeredPane
s。 Here 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(请参阅源代码链接)。我很久没有使用它,但它应该自己管理布局。