Почему BorderLayout перезаписывает компоненты при добавлении новых? - PullRequest
2 голосов
/ 16 октября 2010

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 ]

2 голосов
/ 16 октября 2010

BorderLayout просто не был создан, чтобы делать то, что вы хотите.Разделение ответственности.Если вы хотите такое поведение, вы должны составить: объедините BorderLayout с CardLayout.Хотя для реального поведения стека вам придется что-то кодировать самостоятельно (или найти кого-то, у кого уже есть.)

1 голос
/ 16 октября 2010

Это правильно и по замыслу?

Да.

Вы должны понимать основы работы менеджеров по расположению. Одно из заданий менеджера компоновки - установить «расположение» и «размер» компонентов, добавляемых на панель. В случае BorderLayout он отслеживает только 5 компонентов, поэтому диспетчер макета знает только последний компонент, добавленный в CENTER.

Управление макетом не выполняется при добавлении компонентов на панель. Это делается, когда кадр упакован или сделан видимым (или вызывается метод revalidate ()). В этом случае синяя панель не является частью компонентов, управляемых BorderLayout, поэтому ее размер остается (0, 0), что означает, что рисовать нечего.

Попробуйте изменить код на:

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

и вы увидите синюю панель, окрашенную в указанный размер.

Теперь попробуйте закомментировать:

//panel2.setVisible(false); 

и вы увидите обе панели. Это связано с тем, что при добавлении компонентов на панель им назначается ZOrder. По сути, последний добавленный компонент закрашивается первым, поэтому синяя панель отображается поверх красной панели. Проверьте метод setComponentZOrder () класса Container для получения дополнительной информации.

CardLayout - это, вероятно, менеджер компоновки, который вы должны использовать, но вы также можете проверить Схема наложения .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...