ЯВА: Способы заполнения кадра. add(), setContentPane(), getContentPane()
Я нашел три способа заполнить мой кадр JFrame = новый JFrame("...") createContentPanel возвращает JPanel, а createToolBar возвращает панель инструментов.
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 (...) для заполнения моего фрейма.
4 ответа
Вы правы, что не имеет значения, какой вы используете (JFrame#add(...)
против JFrame#getContentPane().add(...)
) поскольку оба они по сути вызывают один и тот же код, в будущем будут времена, когда вам понадобится доступ к самому контенту, например, если вы захотите изменить его границу, установить цвет фона или определить его размеры и т. д. вы, вероятно, в какой-то момент будете использовать getContentPane(), и, таким образом, будет полезно узнать его и ознакомиться с ним.
// это только помещает последний в JFrame
Вы должны понимать, как работают менеджеры по расположению. Панель содержимого по умолчанию - это JPanel, которая использует BorderLayout. Когда вы добавляете компонент и не указываете ограничение, то по умолчанию это CENTER. Тем не менее, вы можете иметь только один компонент в центре, так что менеджер по расположению знает только о последнем добавленном. Когда менеджер макета вызывается, он устанавливает размер () и расположение () этого компонента. Другой компонент имеет размер 0, поэтому он никогда не окрашивается.
В Java 1.6 вы можете просто использовать add
метод JFrame: http://download.oracle.com/javase/6/docs/api/javax/swing/JFrame.html(он будет делегирован в contentPane.)
http://download.oracle.com/javase/1.4.2/docs/api/javax/swing/JFrame.html
Который говорит:
Класс JFrame немного несовместим с Frame. Как и все другие контейнеры верхнего уровня JFC/Swing, JFrame содержит JRootPane в качестве единственного дочернего элемента. Панель содержимого, предоставляемая корневой панелью, должна, как правило, содержать все компоненты, не относящиеся к меню, отображаемые JFrame. Это отличается от случая AWT Frame. Например, чтобы добавить дочерний элемент в кадр AWT, вы должны написать:
frame.add(child);
Однако, используя JFrame, вам нужно добавить дочерний элемент в панель содержимого JFrame:
frame.getContentPane().add(child);
То же самое верно для установки менеджеров компоновки, удаления компонентов, перечисления дочерних элементов и т. Д. Все эти методы обычно должны отправляться на панель содержимого, а не на сам JFrame. Панель содержимого всегда будет отлична от NULL. Попытка установить его в null приведет к тому, что JFrame сгенерирует исключение. На панели содержимого по умолчанию будет установлен менеджер BorderLayout.