ЯВА: Способы заполнения кадра.add (), setContentPane (), getContentPane () - PullRequest
13 голосов
/ 27 июня 2011

Я нашел три способа заполнить мой кадр 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 ]

8 голосов
/ 27 июня 2011

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

2 голосов
/ 18 августа 2011

В Java 1.6 вы можете просто использовать метод add JFrame: http://download.oracle.com/javase/6/docs/api/javax/swing/JFrame.html (Он будет делегирован на панель содержимого.)

2 голосов
/ 27 июня 2011

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

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

0 голосов
/ 27 июня 2011

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.Попытка установить его в нуль заставит JFrame выдать исключение.На панели содержимого по умолчанию будет установлен менеджер BorderLayout.

...