2012-01-08 20 views
6

Cuando supe la creación de la GUI de Java: s en mi primer curso de Java, me enseñaron a crear mis ventanas como JFrame casos, y luego añadir un JPanel a cada JFrame y finalmente añadir todos los componentes GUI a la JPanel:¿Debo agregar componentes a un JFrame o a su panel de contenido?

class Example extends JFrame { 
    Example() { 
     JPanel panel = new JPanel(); 
     this.add(panel); 

     // Create components here and add them to panel 
     // Perhaps also change the layoutmanager of panel 

     this.pack(); 
     this.setVisibility(true); 
    } 

    public static void main(String[] args) { 
     new Example(); 
    } 
} 

Siempre pensé "bueno, esto huele un poco, no me gusta crear un objeto extra solo para ser un contenedor", pero no conocía otra forma de hacerlo, así que seguí con eso. Hasta hace poco, cuando me tropecé con este "patrón":

class AnotherExample extends JFrame { 
    AnotherExample() { 
     Container pane = this.getContentPane(); 

     // Add components to and change layout of pane instead 

     this.pack(); 
     this.setVisibility(true); 
    } 

    public static void main(String[] args) { 
     new AnotherExample(); 
    } 
} 

Aún siendo bastante nuevo en Java, me siento mejor sobre el segundo enfoque sólo porque no implica la creación de un JPanel sólo para envolver los otros componentes. Pero, ¿cuáles son las diferencias reales entre los enfoques, excepto por eso? ¿Alguno de ellos tiene grandes beneficios sobre el otro?

+1

Lea este tutorial para obtener más información: http://docs.oracle.com/javase/tutorial/uiswing/components/toplevel.html –

+0

¡Gran tutorial! Recomiendo a cualquiera que encuentre esta pregunta que la lea. –

+0

no importa (ambos son malos, no hay necesidad de hacerlo, simplemente agregue al marco) - el olor real es _experimenta JFrame_: la regla de OO es extenderse solo si hay un sonido: una relación (vs. el mero uso, como es el caso en el 99.99% en todas las aplicaciones de interfaz gráfica de usuario) – kleopatra

Respuesta

4

Prefiero crear un JPanel (que, siendo un contenedor Swing, puede tener un borde) y establecer como el panel de contenido.

Para obtener un JComponent fuera del panel de contenido, se requiere fundición, que tiene un olor aún peor que la creación de un componente adicional.

+0

... y ¿por qué haces eso? ¿Qué hace que ese enfoque sea mejor (o diferente) que los dos que publiqué? –

+0

Y por cierto: ¡buena idea! Este es probablemente el enfoque I (ignorante de los hechos reales) mejor hasta el momento =) –

+0

Supongo que el primer comentario se hizo antes de que hubiera editado mi respuesta. Después de enviarlo, volví a leer la pregunta para ver que mi respuesta ... no la había respondido. ;) –

Cuestiones relacionadas