2012-02-07 14 views
8

Sé que, as of Java 1.5, se puede añadir un componente a un JFrame como esto:¿Por qué JFrame originalmente requieren getContentPane() para agregar componentes

myFrame.add (myButton);

en lugar de:

myFrame.getContentPane() añadir (myButton);.

¿Por qué no fue así siempre?

+0

Mi razón para pedir es que estoy enseñando Introducción CS y la todos los ejemplos del libro usan la notación antigua.Me gustaría poder darles a los estudiantes alguna razón por la cual una vez fue necesario dar el paso extra. –

Respuesta

9

Como se detalla en el JFrame API, ambos hacen lo mismo: agregue un componente al panel de contenido. Recientemente (¿Java 1.5 quizás?) Swing agregó el método sintáctico de azúcar/conveniencia para permitirte realizar esta llamada directamente en el JFrame (o en cualquier otro contenedor Swing de nivel superior), pero aún estás agregando contenido al Panel de contenido. Lo mismo para remove(...) y setLayout(...) Esto se vuelve demasiado claro si intenta establecer el color de fondo del JFrame a través del myJFrame.setBackground(Color.green); y no sucede nada. Es por esta razón, no estoy muy contento con este cambio. Eso y también porque debo ser un viejo cascarrabias.

+0

¿Podría decirme por qué no está satisfecho con el cambio? Estoy tratando de entender el argumento en contra. –

+3

El concepto lleva a los novatos a creer que el JFrame es realmente lo que está obteniendo el componente. ** Nuevamente ** intente llamar a setBackground (...) en el JFrame. –

+0

Gracias. ¿Por qué no hacer JFrame el contenedor en primer lugar para que setBackground() haga lo que espera la gente? –

7

4753342: componente de nivel superior del swing debe redirigir añadir/eliminar métodos para contentPane

Descripción:

Contrariamente a la programación de AWT, JFrame/JDialg/JWindow/JApplet/JInternalFrame no lo hacen le permite agregar Component s, en su lugar debe aprender sobre JRootPane y agregar niños Component s a él. Esto agrega confusión innecesaria a los nuevos desarrolladores de .

Antes de 5,0, en un intento de añadir o eliminar un Component de uno de estos nivel superior Component s darían lugar a una excepción ser lanzado. En 5.0, no se lanzará ninguna excepción, en su lugar se agregará 0 eliminará el Component del panel de contenido. Esto dio lugar a varias revisiones al javadoc de JFrame, JDialog, JWindow, JApplet y JInternalFrame. Esto se ha resumido en javadoc de RootPaneContainer:

* 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); 
* </pre> 
* you can do: 
* <pre> 
* rootPaneContainer.add(component); 
* </pre> 
* <p> 
* The behavior of <code>add</code> and its variants and 
* <code>setLayout</code> for 
* <code>JFrame</code>, <code>JDialog</code>, <code>JWindow</code>, 
* <code>JApplet</code> and <code>JInternalFrame</code> is controlled by 
* the <code>rootPaneCheckingEnabled</code> property. If this property is 
* true, the default, then <code>add</code> and its variants and 
* <code>setLayout</code> are 
* forwarded to the <code>contentPane</code>, if it is false, then these 
* methods operate directly on the <code>RootPaneContainer</code>. This 
* property is only intended for subclasses, and is therefor protected. 

Además, aquí hay un error relacionado:

+0

¡Información muy útil! 1+ –

+0

Muy útil, gracias. – Alanmars

Cuestiones relacionadas