Подтвердить что ты не робот

JAVA: Способы заполнения кадра. add(), setContentPane(), getContentPane()

Я нашел три способа заполнить свой JFrame frame = new JFrame ( "..." ) createContentPanel возвращает JPanel, а createToolBar возвращает ToolBar.

frame.add(this.createToolBar(), BorderLayout.PAGE_START); //this works and puts the ToolBar above and the ContentPanel under it<br>
frame.add(this.createContentPanel(), BorderLayout.CENTER);

frame.setContentPane(this.createContentPanel()); //this lets the JToolBar hover over the ContentPanel
frame.getContentPane().add(this.createToolBar()); 

frame.getContentPane().add(this.createContentPanel()); //this only puts the last one into the JFrame
frame.getContentPane().add(this.createToolBar());

И теперь мне интересно, почему я должен использовать метод getContentPane()/setContentPane(), если бы я мог просто использовать простой frame.add(...) для заполнения моего фрейма.

4b9b3361

Ответ 1

Вы правы, что неважно, что вы используете (JFrame#add(...) vs. JFrame#getContentPane().add(...)), поскольку они по сути называют один и тот же код, однако в будущем будут случаи, когда вам понадобится доступ к contentPane, например, если вы хотите изменить его границу, установить его цвет фона или определить его размеры, и поэтому в какой-то момент вы, вероятно, будете использовать getContentPane(), и, таким образом, познакомиться с ним и быть знакомым с ним было бы полезно.

Ответ 2

//это только помещает последний в JFrame

Вам нужно понять, как работают менеджеры макетов. Область содержимого по умолчанию - это JPanel, который использует BorderLayout. Когда вы добавляете компонент и не указываете ограничение, оно по умолчанию относится к CENTER. Однако вы можете иметь только один компонент в центре, чтобы менеджер компоновки знал только о последнем добавленном. Когда вызывается менеджер компоновки, он устанавливает размер() и location() этого компонента. Другой компонент имеет размер 0, поэтому он никогда не окрашивается.

Ответ 4

http://download.oracle.com/javase/1.4.2/docs/api/javax/swing/JFrame.html

Что говорит:

Класс JFrame немного несовместимый с рамкой. Как все другие контейнеры верхнего уровня JFC/Swing, JFrame содержит JRootPane как его единственный ребенок. Панель содержимого предоставлена по корневой панели должно, как правило, содержат все компоненты без меню отображаемый JFrame. Это отличающийся от корпуса AWT Frame. Для Например, чтобы добавить ребенка в AWT кадр, который вы должны написать:

   frame.add(child);   

Однако, используя JFrame, вам нужно добавить ребенка на панель содержимого JFrame:

   frame.getContentPane().add(child);  

То же самое верно для настройки макета менеджеров, удаление компонентов, листинг детей и т.д. Все эти методы обычно должны отправляться на контент вместо самой JFrame. область содержимого всегда будет не нулевой. Попытка установить его на null заставляют JFrame исключение. Область содержимого по умолчанию будет установлен менеджер BorderLayout на нем.