2010-10-15 106 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