Почему JFrame изначально требовал getContentPane () для добавления компонентов - PullRequest
8 голосов
/ 07 февраля 2012

Я знаю, что с Java 1.5 , можно добавить компонент в JFrame следующим образом:

myFrame.add (myButton);

вместо:

myFrame.getContentPane (). Add (myButton);

Почему это не всегда так?

Ответы [ 2 ]

9 голосов
/ 07 февраля 2012

Как указано в JFrame API , оба делают одно и то же: добавляют компонент в contentPane.Это совсем недавно (возможно, Java 1.5?) Swing добавил синтаксический метод sugar / удобство, чтобы позволить вам сделать этот вызов непосредственно в JFrame (или любом другом контейнере верхнего уровня Swing), но вы все еще добавляете в contentPane.То же самое для remove(...) и setLayout(...). Это становится слишком ясно, если вы попытаетесь установить цвет фона JFrame с помощью myJFrame.setBackground(Color.green);, и ничего не произойдет.Именно по этой причине я не слишком доволен этим изменением.Это, а также потому, что я, должно быть, старый придурок.

7 голосов
/ 07 февраля 2012

4753342: компонент верхнего уровня Swing должен перенаправить добавить / удалить методы для ContentPane

Описание:

В отличие от программирования AWT, JFrame / JDialg / JWindow / JApplet / JInternalFrame не позволяют добавлять Component s к нему, вместо этого вы должны узнать о JRootPane и добавить дети Component с. Это добавляет ненужную путаницу к новым Разработчики.

До 5.0 пытался добавить или удалить Component из одного из эти верхние уровни Component s приведут к исключению. В 5.0, исключение не выдается, вместо этого Component будет добавлено или удалено из области содержимого. Это привело к нескольким изменениям на javadoc JFrame, JDialog, JWindow, JApplet и JInternalFrame. Это было обобщено в RootPaneContainer Javadoc:

<code> * For conveniance
 * <code>JFrame</code>, <code>JDialog</code>, <code>JWindow</code>,
 * <code>JApplet</code> and <code>JInternalFrame</code>, by default,
 * forward all calls to <code>add</code> and its variants,
 * <code>remove</code> and <code>setLayout</code> to the
 * <code>contentPane</code>. This means rather than writing:
 * <pre>
 * rootPaneContainer.getContentPane().add(component);
 * 
* ты можешь сделать: *
 * rootPaneContainer.add(component);
 * 
*

* Поведение add и его вариантов и * setLayout для * JFrame, JDialog, JWindow, * JApplet и JInternalFrame контролируется * свойство rootPaneCheckingEnabled. Если это свойство * true, значение по умолчанию, затем add и его варианты и * setLayout являются * перенаправлен на contentPane, если он ложный, то эти * методы работают непосредственно на RootPaneContainer. это * свойство предназначено только для подклассов и поэтому защищено.

Также вот связанная ошибка:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...