getContentpane().add() vs add()
Cuando utilicemos la clase JFrame uno de los componentes (objetos) que añadiremos a este elemento contenedor es un panel perteneciente a la clase JPanel. Este último se comportará como una capa que se encuentra por encima del objeto de la clase JFrame. Es encima de este panel donde añadiremos los demás objetos como botones, etiquetas y cuadros de texto, etc.
El símil de un panel, sea JPanel sea el panel por defecto de JFrame (el objeto contentPane), lo podemos ver en un móvil recién comprado. ¿Qué medida adoptamos con la pantalla de dicho dicho móvil? Acoplarle un protector de pantalla con el fin de evitar posibles rayazos, rozaduras o roturas.
A continuación explicaremos la utilización de método add() por defecto, es decir, sin uso de la clase JPanel.
Marcos y panel por defecto (JFrame y contentPane)
Para añadir componentes a un JFrame tenemos dos sentencias posibles:
- getContentPane().add(componente);
- add(componente);
Antes de continuar debemos considerar dos características importantes de los marcos de la clase JFrame:
- JFrame, independientemente de que utilicemos JPanel, ya cuenta con una capa por defecto. El método getContentPane() de una instancia a JFrame nos devuelve este panel.
- add() y getContentPane().add() realizan, por defecto, la misma acción:
JButton boton=new JButton("CANCELAR"); JFrame marco=new JFrame("Pruebas de JFrame"); marco.add(boton);// Esta opción es lo mismo que la instrucción siguiente //marco.getContentPane().add(boton);//La mejor opción
La razón de que add() y getContentPane().add() realicen los mismo es debido a que add() de forma automática "se redirige" a método getContentPane().add() capturando el objeto contentPane del frame.
Para ilustrar con más claridad lo dicho con anterioridad mostraremos otro ejemplo. Observa el siguiente código:
JFrame marco=new JFrame("Pruebas de JFrame");
//damos color de fondo al JFrame, como observamos azul
marco.setBackground(Color.BLUE);
//le otorgo transparencia al panel por defecto que se encuentra por encima
marco.getContentPane().setBackground(new Color(255,255,255,1));
//damos altura y posicionamos JFrame
marco.setBounds(400, 400, 200, 200);
//garantizamos que el JFrame se pueda cerrar
marco.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//lo mostramos
marco.setVisible(true);
En el código superior observamos que con el método setBackground puedo dar formato al fondo tanto del propio objeto marco de la clase JFrame (marco.setBackground(Color.BLUE);
) como a su panel por defecto, contentPane, mediante la instrucción marco.getContentPane().setBackground(new Color(255,255,255,1));
Debido a que he pintado el panel (contentPane) en color transparente puedo ver el color de fondo (azul) del marco JFrame.
En conclusión cuando se utiliza una instrucción add() indirectamente manejamos el método getContentPane().add() que hace referencia al panel por defecto. Desde un punto de vista estricto es más exacto utilizar esta última instrucción.