Есть ли разница между ними и существуют ли какие-либо условия, в которых следует использовать вместо другого?
Когда я должен использовать JFrame.add(компонент) и JFrame.getContentPane(). Добавить (компонент) в java
Ответ 1
Из того, что я понимаю из Javadocs, JFrame.add вызывает последнее. Это удобный способ обойти несовместимость между рамкой AWT и Swings 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)
), но я не уверен, что вы захотите это сделать.