2010-10-15 108 views
2

BorderLayout会做一些奇怪的事情。如果我想补充两个面板的Container用相同的约束(BorderLayout.CENTER例如),那么第一个消失了,即使第二个被删除或不可见为什么BorderLayout会在添加新组件时覆盖组件?

它好像它将使意义它在前面的元素上面堆叠每个元素。

这是正确的,通过设计?如果是这样,是否有一些文件?

有没有其他人对此感到沮丧?你有没有解决方案,比如自定义LayoutManager

示例代码:

JFrame frame = new JFrame(); 
frame.setSize(500, 500); 

JPanel panel1 = new JPanel(); 
panel1.setBackground(Color.blue); 
frame.getContentPane().add(panel1); 

JPanel panel2 = new JPanel(); 
panel2.setBackground(Color.red); 
frame.getContentPane().add(panel2); 

panel2.setVisible(false); // Seems like it should allow us to see panel1. 

frame.setVisible(true); 

这将创建并显示一个500×空白框。

回答

2

BorderLayout根本没有设计做你想做的。职责分离。如果你想要这种行为,你应该撰写:将BorderLayoutCardLayout结合起来。尽管对于实际的堆栈行为,您必须自己编写代码(或找到已有的人)。

1

这是正确的和设计?

是。

您需要了解布局管理器如何工作的基础知识。布局管理器的工作之一是设置添加到面板的组件的“位置”和“大小”。在BorderLayout的情况下,它只追踪5个组件,所以布局管理器只知道添加到CENTER的最后一个组件。

将组件添加到面板时不会执行布局管理。它是在框架打包或可见的情况下完成的(或者调用revalidate()方法)。在这种情况下,蓝色面板不是由BorderLayout管理的组件的一部分,因此它的大小保持为(0,0),这意味着没有任何内容可以绘制。

试着改变你的代码:

JPanel panel1 = new JPanel(); 
panel1.setSize(200, 200); 

,你会看到涂在指定大小的蓝色面板。

现在尝试注释掉:

//panel2.setVisible(false); 

,你会看到两个面板。这是因为随着组件被添加到面板中,它们被分配ZOrder。基本上最后添加的组件首先被绘制,这就是为什么蓝色面板被绘制在红色面板的顶部。查看Container类的setComponentZOrder()方法以获取更多信息。

CardLayout可能是您应该使用的布局管理器,但您也可以查看Overlap Layout