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的空白框。
答案 0 :(得分:2)
BorderLayout
根本不是为了做你想做的事而设计的。分离责任。如果您想要这种行为,您应该撰写:将BorderLayout
与CardLayout
结合起来。虽然对于实际的堆栈行为,您必须自己编写代码(或找到已经拥有的人。)
答案 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。