когда я должен использовать JFrame.add (компонент) и JFrame.getContentPane (). add (компонент) в Java - PullRequest
12 голосов
/ 26 сентября 2011

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

Ответы [ 4 ]

14 голосов
/ 26 сентября 2011

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

Из заметок о выпуске Java 5 :

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

Также см. javadocs .

4 голосов
/ 26 сентября 2011

, если ваш вопрос только о JFrame#add(JComponent) против JFrame.getContentPane()#add(JComponent), тогда нет никакой разницы, но если вы хотите изменить fe BackGround, то зависит от того, вызываете ли вы методы из JFrame#setBackground(Color) или вложенные или наследуете методы из awt.FrameJFrame.getContentPane()#setBackground(Color) ...

3 голосов
/ 26 сентября 2011

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

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

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

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

3 голосов
/ 26 сентября 2011

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

Из Javadocs для JFrame :

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

   `frame.add(child);`

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

...