Mostrar imágenes al pulsar en los botones.
Mostrar el código Java en un segundo JFrame
En este ejercicio se crea una ventana (derivada de JFrame) con botones
que, al ser pulsados, generan acciones (mostrar imágenes, rellenar etiquetas de
texto, abrir otro JFrame...).
Los aspectos fundamentales del ejercicio son:
- Repasar la disposición en contenedores y paneles de las ventanas. Se emplea
un objeto Container, que es un componente genérico AWT que puede contener otros
componentes AWT.
- Swing proporciona 3 contenedores de primer nivel: JFrame, JDialog y JApplet,
cada uno de ellos contiene un panel raíz (JRootPane) con varios elementos:
- panel de contenido (contentPane): los componentes visibles del contenedor
de primer nivel, excepto barra de menú (por defecto tiene BorderLayout)
- barra de menú (menuBar): es opcional, está fuera de contentPane
- panel de cristal (glassPane): por encima de menuBar y contentPane, está oculto
por defecto y se encarga de interceptar acciones del usuario para JRootPane
- No se puede añadir elementos directamente a JRootPane:
rootPane.add(elemento); // NO
hay que añadirlos al contentPane de rootPane con el método getContentPane():
rootPane.getContentPane().add(elemento); // SI
- Para añadir elementos a un Frame:
Frame.getContentPane().add(elemento);
getContentPane() devuelve un objeto Container, no un objeto JComponent.
- Para usar un componente como contentPane:
- crear un panel y añadirle componentes:
JPanel panel = new JPanel(new BorderLayout());
panel.setBorder(elegirBorde);
panel.add(unComponente, BorderLayout.CENTER);
panel.add(otroComponente, BorderLayout.SOUTH);
- hacer que el panel sea contentPane de un contenedor de nivel superior:
panel.setOpaque(true);
topLevelContainer.setContentPane(panel);
- Varios de los botones se añaden a su panel mediante un bucle For en lugar
de ir añadiéndolos sucesivamente uno a uno en código estructurado:
// siendo strBotones un Array de JButton y pBotones el JPanel
al que se añaden
for(int i = 0; i < strBotones.length; i++) {
pBotones.add(strBotones[i]);
strBotones[i].addActionListener(this);
}
- Para mostrar una imagen diferente al pulsar en cada uno de los botones:
- los archivos JPG están empaquetados en el archivo JAR ejecutable, en
una subcarpeta /img
- para acceder al fichero JPG se utiliza la variable URL (para ello es
necesario importar el paquete java.net.URL) y el método getResource:
URL url = this.getClass().getResource( nombre_fichero.jpg
);
la instrucción anterior equivale a esta otra:
URL url = nombre_de_la_clase.class().getResource( nombre_fichero.jpg
);
- dependiendo del sitio en que getResource encuentra la imagen,
la cadena devuelta URL presenta diferentes aspectos (el contenido de URL
se muestra en una etiqueta para comprobar ésto):
- imagen en un archivo JAR del disco local:
jar:file:C:/ruta_absoluta_al_archivo_jar.jar!/imagen.jpg
- imagen en un archivo JAR del servidor:
jar:http://www.dominio.com/archivo.jar!/imagen.jpg
- imagen en un archivo del disco local:
file:C:/ruta_absoluta_a_la_imagen.jpg
- imagen en un archivo del servidor:
http://www.dominio.com/ruta_relativa_a_la_imagen.jpg
- la variable url se pasa a un objeto JLabel para que su método setIcon
coloque la imagen JPG en la etiqueta:
// JLabel.setIcon(Icono icono) define el icono mostrado
en la etiqueta, centrado en horizontal y en vertical
etiquetaJLabel.setIcon(new ImageIcon(url));
- Imagen de la aplicación en funcionamiento:

Se puede observar que el código Java de esta aplicación se ejecuta correctamente
en otros sistemas (MacOS X en este caso):

Observaciones para desarrollar estos programas en MacOS X:
- MacOS X tiene soporte completo para Java, tanto para ejecución como
para desarrollo, y Apple mantiene la máquina virtual actualizada (se descarga
desde Actualizaciones de software)
- es factible programas Java con un editor de texto simple y Terminal
pero es mucho más sencillo usar el entorno XCode que MacOsX 10.3 (Panther)
y 10.4 (Tiger) traen incorporado
- si llevas archivos de código fuente Java hechos en Windows a MacOS X,
recuerda compilar desde aquí de nuevo
- XCode sirve para programar tanto Java como aplicaciones de MacOS X y
viene con coloreado de sintaxis, gestión de proyectos de varios archivos,
motor de depuración y ejecución, gestión de errores de depuración, ayuda,
etc...
- la versión de XCode para MacOS X 10.3 es distinta que la versión para
MacOS X 10.4
- MacOS X presenta algunas diferencias respecto a Windows, como ejemplo,
la asignación del tamaño a una ventana (JFrame, por ejemplo) se puede hacer
con setSize y setPreferredSize pero, en MacOS X, setPreferredSize
da frecuentemente un error y setSize funciona bien
- XCode instala Java Browser, una herramenta muy útil para explorar las
clases Java instaladas en el sistema y ver la ayuda de Javadoc para los
ítems
- Para abrir un segunfo JFrame en el que se muestra el código Java de la clase:
- se crea un documento
web con el código java convertido a código HTML
- se crea una segunda clase (clase_2) con el código necesario para abrir
una nueva ventana en la que un componente JEditorPane muestra el texto HTML
del documento web pasándole la ruta URL como parámetro:
JEditorPane editorPane = new JEditorPane();
editorPane.setEditable(false);
URL url = clase_2.class.getResource("archivo.html");
// también puede ser
//URL url = this.getClass.getResource("archivo.html");
editorPane.setPage(url);
- en la clase principal, abrir la segunda ventana creando una instancia
de clase_2 mediante el método JFrame.show():
// mostrar un objeto de clase_2, es el marco para la
2ª ventana
clase_2 codeForm = new clase_2();
codeForm.show(); }
- imagen del segundo
JFrame mostrando código Java como HTML
- Código completo de la clase
principal.
- Código completo de la segunda
clase.
- Descargar las imágenes
empleadas en el programa.