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

Когда я должен использовать JFrame.add(компонент) и JFrame.getContentPane(). Добавить (компонент) в java

Есть ли разница между ними и существуют ли какие-либо условия, в которых следует использовать вместо другого?

4b9b3361

Ответ 1

Из того, что я понимаю из Javadocs, JFrame.add вызывает последнее. Это удобный способ обойти несовместимость между рамкой AWT и Swings JFrame.

От javadocs для JFrame:

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

   `frame.add(child);`

И ребенок будет добавлен в ContentPane. Область содержимого всегда будет не нулевой. Пытаться установите его в null, чтобы JFrame выдал исключение. на панели содержимого по умолчанию будет установлен менеджер BorderLayout. обращаться для RootPaneContainer для получения дополнительной информации о добавлении, удалении и настройке LayoutManager JFrame.

Ответ 2

Оба вызова одинаковы. В Java 5 они изменили jframe.add на переадресацию вызовов на панель содержимого.

Из примечаний к выпуску Java 5:

Наконец, через семь лет мы сделали jFrame.add эквивалентом jFrame.getContentPane(). Добавить().

Также см. javadocs.

Ответ 3

если ваш вопрос касается только JFrame#add(JComponent) v.s. JFrame.getContentPane()#add(JComponent), тогда нет разницы, но если вы хотите изменить f.e. BackGround тогда зависит, если вы вызываете методы из JFrame#setBackground(Color) или вставляете или наследуете методы из awt.Frame JFrame.getContentPane()#setBackground(Color)...

Ответ 4

add() перенаправляет работу на addImpl(), для которой JavaDoc JFrame указывает следующее:

По умолчанию дети добавляются в contentPane вместо фрейма.

Таким образом, оба метода имеют одно и то же основное поведение, кроме того, что использование getContentPane().add(...) более явное.

Обратите внимание, что вы можете изменить поведение по умолчанию для добавления (используя setRootPaneCheckingEnabled(false)), но я не уверен, что вы захотите это сделать.