为什么BorderLayout会在添加新组件时覆盖组件?

时间:2010-10-15 23:11:03

标签: java awt

BorderLayout做了一件奇怪的事。如果我使用相同的约束(例如Container)向BorderLayout.CENTER添加两个面板,那么第一个面板就会消失,即使第二个面板被删除或不可见

似乎将每个元素“堆叠”在之前的元素之上是有意义的。

这是正确的吗?如果是的话,是否有一些文件?

还有其他人对此感到沮丧吗?您有解决方案,例如自定义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);

这会创建并显示一个500x500的空白框。

2 个答案:

答案 0 :(得分:2)

BorderLayout根本不是为了做你想做的事而设计的。分离责任。如果您想要这种行为,您应该撰写:将BorderLayoutCardLayout结合起来。虽然对于实际的堆栈行为,您必须自己编写代码(或找到已经拥有的人。)

答案 1 :(得分: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

相关问题