Escolar Documentos
Profissional Documentos
Cultura Documentos
1.- Introduccin
2.- Ventanas: la clase Frame
3.- Componentes Bsicos
4.- Eventos de teclado y de ratn
5.- Estilos
6.- Dibujando
7.- Applets
8.- Dilogos y mensajes
1.- Introduccin
1.1 AWT y Swing
1.2 Un poco de filosofa
1.3 La jerarqua Component
La razn principal es que, a pesar de ser Swing ms fcil de manejar est basado en
conceptos ms complejos, difciles de entender si primero no se conoce AWT; Swing
contiene demasiado de AWT como para, simplemente, ignorarlo. La mayora de los autores
piensa que es mejor seguir al estudiar el lenguaje la evolucin que han seguido sus
diseadores. Por eso nos limitaremos aqu al estudio de AWT. Si se comprenden los
conceptos de este tema pasar posteriormente a Swing no supondr ningn problema. Otro
buena razn es que al ser AWT ms antiguo, los applets de internet escritos en AWT
funcionan en muchos ms exploradores que los escritos con Swing. Por tanto usando AWT
nos aseguramos una mayor compatibilidad.
Clase Component
Mtodo
String getName()
Descripcin
Devuelve el nombre del componente
void setName(String)
Dimension getSize()
void setSize(Dimension)
Anlogo al anterior
Color getBackground
void setBackground(Color)
Color getForeground
void setForeground(Color)
Font2 getFont()
void setFont(Font)
Boolean getVisible()
void setVisible(Boolean)
Boolean getEnabled()
void setEnabled(Boolean)
Graphics getGraphics()
repaint()
repaint(int x, int y, int width, Llamaremos a este mtodo para pedirle al componente que redibuje el
int height)
rectngulo indicado
void Paint(Graphics g)
void Update(Graphics g)
Point3 getLocation()
void setLocation(Point p)
Container getParent()
Aunque no vamos a estudiarlas todas, conviene saber para qu sirve cada una de ellas, y
referirnos a la ayuda de Java cuando sea necesario:
Componentes
Bsicos
Clase
Descripcin
Button
Canvas
Choice
CheckBox
Label
List
Scrollbar
Barra de desplazamiento
TextField
TextArea
Similar a TextField pero permite introducir texto que ocupe varias lneas
Contenedore
s
Clase
Descripcin
Panel
Applet
Window
Frame
Dialog
Ventana que se muestra sobre la ventana actual (Ej.: la tpica ventana para preguntar
"Est seguro de ...." y dos botones de Aceptar y Cancelar)
FileDialog
Similar al anterior, pero especializado para la seleccin de ficheros (se suele utilizar en
las opciones de "Abrir" o "Grabar como" )
El tamao se fija con el mtodo void setSize(int, int) y la posicin con setLocation(int,int).
Ambos pertenecen a la clase Component. Ejemplo:
ventana.setSize(300, 100);
ventana.setLocation(100,50);
har que los componentes se siten uno al lado del otro, de izquierda a derecha y de arriba a
abajo.
Observacin: Todos los estilos (como FlowLayout) son subclases de la clase Layout y
por eso pueden ser utilizados como argumentos del mtodo setLayout. Es un ejemplo de
polimorfismo.
Incorporar los componentes
En este paso se aaden los componentes que se desee incluir en la ventana. Para eso se
utiliza el mtodo void add(Component) heredado de la clase Container. Por ejemplo:
Label etiq = new Label("Te estoy mirando...");
ventana.add(etiq);
Observacin: Otro ejemplo de polimorfismo: etiq es de tipo Label, pero Label hereda
de Component y por eso etiq puede ser argumento del mtodo add, cuyo argumento est
declarado de tipo Component.
Aviso: Un error habitual es olvidar este paso con lo que la ventana no se mostrar
WINDOW_OPENED
WINDOW_CLOSING
WINDOW_CLOSED
WINDOW_ICONIFIED
WINDOW_DEICONIFIED
WINDOW_ACTIVATED
WINDOW_DEACTIVATED
WINDOW_GAINED_FOCUS
WINDOW_LOST_FOCUS
WINDOW_STATE_CHANGED
void windowActivated(WindowEvent e)
void windowClosed(WindowEvent e)
void windowClosing(WindowEvent e)
void windowDeactivated(WindowEvent e)
void windowDeiconified(WindowEvent e)
void windowIconified(WindowEvent e)
void windowOpened(WindowEvent e)
De todos ellos el que nos interesa ahora es windowClosing que se utiliza cuando el usuario
trata de cerrar la ventana. Para que al pulsar se cierre realmente tendremos que incluir una
llamada a System.exit(0), que fuerza el fin de la aplicacin. La clase puede ser por ejemplo:
class ParaAcabar extends WindowAdapter {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
}
2.3 Ejemplo
El siguiente programa rene todos los conceptos anteriores:
Principal.java
import java.awt.*;
import java.awt.event.*;
public class Principal {
public static void main(String[] args) {
// objeto de tipo ventana
Frame ventana = new Frame("Ventana de prueba");
// ventana cuadrada centrada en la pantalla y
// ocupando un tercio de la pantalla
Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
// calculamos el tamao de la ventana a partir del ancho de la pantalla
int ancho=d.width/3;
int alto=d.height/3;
ventana.setSize(ancho, alto);
ventana.setLocation(d.width/2-ancho/2,d.height/2-alto/2);
// colores, ttulo y fuente
ventana.setBackground(new Color(20,140,10));
ventana.setForeground(Color.blue);
Font fuente = new Font("Arial", Font.PLAIN, 20);
ventana.setFont(fuente);
ventana.setTitle("Ejemplo de ventana ");
// estilo
FlowLayout estilo = new FlowLayout();
ventana.setLayout(estilo);
// componentes
Label etiq = new Label("Te estoy mirando...");
ventana.add(etiq);
// aadimos el "listener" para cerrar la ventana
ParaAcabar acabar = new ParaAcabar();
ventana.addWindowListener(acabar);
// hacemos la ventana visible
ventana.setVisible(true);
}
}
// clase escucha que se ejecuta al tratar de cerrar la ventana
class ParaAcabar extends WindowAdapter {
public void windowClosing(WindowEvent e) {
System.exit(0); // abandonar la aplicacin
}
}
Es interesante observar que la clase para cerrar la ventana se encuentra, por comodidad, en
el mismo fichero que la clase principal. Esto es posible porque esta clase no es pblica.
Observacin: En cada fichero .java puede haber una nica clase pblica, pero tambin se
permite incluir otras clases -no pblicas- que sirvan de clases auxiliares de la clase pblica.
import java.awt.*;
import java.awt.event.*;
public class Ventana extends Frame {
public Ventana() {
// ventana cuadrada centrada en la pantalla y
// ocupando un tercio de la pantalla
Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
// calculamos el tamao de la ventana a partir del ancho de la pantalla
int ancho=d.width/3;
int alto=d.height/3;
setSize(ancho, alto);
setLocation(d.width/2-ancho/2,d.height/2-alto/2);
// colores, ttulo y fuente
setBackground(new Color(20,140,10));
setForeground(Color.blue);
Font fuente = new Font("Arial", Font.PLAIN, 20);
setFont(fuente);
setTitle("Ejemplo de ventana ");
// estilo
FlowLayout estilo = new FlowLayout();
setLayout(estilo);
// componentes
Label etiq = new Label("Te estoy mirando...");
add(etiq);
// aadimos el "listener" para cerrar la ventana
ParaAcabar acabar = new ParaAcabar();
addWindowListener(acabar);
}
}
// clase escucha que se ejecuta al tratar de cerrar la ventana
class ParaAcabar extends WindowAdapter {
public void windowClosing(WindowEvent e) {
System.exit(0); // abandonar la aplicacin
}
}
De esta forma la clase ventana tiene todos los mtodos de la clase Frame ms todos los que
nosotros aadamos posteriormente. La clase principal queda simplemente:
Principal.java
public class Principal {
public static void main(String[] args) {
// objeto de tipo ventana
Ventana ventana = new Ventana();
// hacemos la ventana visible
ventana.setVisible(true);
}
}
y en el resto del captulo a menudo la omitiremos para evitar repetir el cdigo, que es
independiente de la ventana.
Label(): La constructora por defecto, crea una etiqueta con un String vaco.
Mtodos
Aparte de los mtodos heredados de Object y Component, esta clase tiene dos mtodos
importantes:
Mtodos
Algunos de los mtodos ms importantes, adems de los heredados de Component, son:
Vamos a ver un primer ejemplo. En este ejemplo se separa la aplicacin en dos clases
independientes: la clase con el main y la clase con la ventana:
Ventana.java
package ventanas;
import java.awt.*;
import java.awt.event.*;
System.exit(0); }
En este ejemplo aparece la ventana pero al pulsar el botn todava no hace nada. En el
siguiente apartado veremos como hacer que el botn "reaccione" cuando es pulsado.
Eventos
La idea es que no ser el propio botn sino un objeto escucha el que ser informado por
Java para que acte cuando el botn sea pulsado. Para lograr esto hay que:
1. Escribir una clase adecuada a la que pertenecer el objeto escucha. Esta clase debe,
en el caso de los botones, implementar el interfaz java.awt.event.ActionListener.
2. Declarar un objeto del tipo anterior (normalmente en la constructora de la ventana, a
la vez que se crea el botn).
3. Asociar el objeto de tipo escucha con el botn o, dicho con la terminologa habitual
de Java, registrar el objeto como escucha del botn. Esto se hace utilizando el
mtodo void addActionListener(ActionListener l).
El interfaz ActionListener tiene un slo mtodo: void actionPerformed(ActionEvent e), al
que se invocar cuando ocurra un evento sobre el botn (normalmente que ha sido pulsado).
String getActionCommand() .
Object getSource(): Fuente del evento (objeto de tipo Button).
El siguiente ejemplo hace que el botn, al ser pulsado escriba por pantalla el mensaje
"Gracias".
Ventana.java
package ventanas;
import java.awt.*;
import java.awt.event.*;
public class Ventana extends Frame {
Button botn;
Label etiq;
// constructora
public Ventana() {
// titulo, estilo, tamao y posicin iniciales
setTitle("Ejemplo de ventana con boton (v.2) ");
setLayout(new FlowLayout());
setSize(300, 100); setLocation(100,50);
// le damos un poco de color a la ventana
setBackground(Color.yellow);
// una etiqueta
etiq = new Label("Un botn:");
add(etiq);
// creamos el botn
botn = new Button("Plsame");
botn.setBackground(Color.blue);
botn.setForeground(Color.white);
// lo incorporamos a la ventana
// importante: si no se hace esto no sera visible
add(botn);
// preparamos la escucha del boton
Escucha e = new Escucha();
// la registramos
botn.addActionListener(e);
// aadimos la escucha para cerrar la ventana
addWindowListener(new ParaAcabar());
}
}
// clase para cerrar la ventana
class ParaAcabar extends WindowAdapter {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
}
// escucha del boton
class Escucha implements ActionListener {
public void actionPerformed(ActionEvent e) {
System.out.println("Gracias");
}
}
Ejercicio: Hacer que el botn escriba al hacer click el nmero de veces que ha sido pulsado
desde que ha comenzado la aplicacin (solucin en el siguiente apartado).
Interaccin con otros componentes grficos
Supongamos que pretendemos que el botn cambie de color de fondo cada vez que se le
pulse. Para ello podemos utilizar el mtodo setBackground y generar un color aleatorio
utilizando el mtodoMath.random(). Un primer intento consiste en modificar la
clase Escucha de la siguiente forma:
// escucha del boton
class Escucha implements ActionListener {
public void actionPerformed(ActionEvent e) {
// generamos un color aleatorio
Color c = new Color((int)(Math.random()*256),(int)(Math.random()*256),
(int)(Math.random()*256));
// cambiamos el color del boton
boton.setBackground(c);
}
}
}
}
Esta solucin no se puede aplicar si queremos interactuar con otro componente distinto del
botn.
Ejemplo: Supongamos que queremos que al pulsar el botn se muestre en la etiqueta el
nmero de veces que se ha pulsado el botn desde que comenz la aplicacin.
En este caso no nos vale de nada la variable ActionEvent e; la etiqueta est definida en la
clase ventana y debemos ''obtenerla'' de otra forma. Vamos a ver dos posibilidades:
1.
Definir un atributo en la clase escucha que contendr una referencia al componente
externo deseado.
Este atributo se inicializar mediante la constructora.
2.
En nuestro caso:
3. Ventana.java
4.
5. package ventanas;
6.
7. import java.awt.*;
8.
9. import java.awt.*;
10. import java.awt.event.*;
11.
12. public class Ventana extends Frame {
13.
14.
// constructora
15.
public Ventana() {
16.
17.
// titulo, estilo, tamao y posicin iniciales
18.
setTitle("Ejemplo de ventana con boton (v.3) ");
19.
setLayout(new FlowLayout());
20.
setSize(300, 100);
21.
setLocation(100,50);
22.
23.
// le damos un poco de color a la ventana
24.
setBackground(Color.yellow);
25.
26.
// una etiqueta
27.
Label etiq = new Label("An no has pulsado");
28.
add(etiq);
29.
30.
// creamos el boton
31.
Button boton = new Button("Plsame");
32.
boton.setBackground(Color.blue);
33.
boton.setForeground(Color.white);
34.
35.
// incorporamos el boton al frame
36.
// importante: si no se hace esto no sera visible
37.
add(boton);
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
82.
83.
81.
84.
Java permite escribir una clase auxiliar dentro de la clase con la que ''colabora''. As
podemos definir la clase escucha como una subclase privada de la clase Ventana, que
al ser miembro de la clase tiene acceso a los atributos:
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
package ventanas;
import java.awt.*;
import java.awt.*;
import java.awt.event.*;
public class Ventana extends Frame {
private int contador;
private Label etiq;
private Button botn;
// constructora
public Ventana() {
contador = 0;
// titulo, estilo, tamao y posicin iniciales
setTitle("Ejemplo de ventana con boton (v.3) ");
setLayout(new FlowLayout());
setSize(300, 100); setLocation(100,50);
// le damos un poco de color a la ventana
setBackground(Color.yellow);
// una etiqueta
etiq = new Label("An no has pulsado");
add(etiq);
// creamos el boton
botn = new Button("Plsame");
botn.setBackground(Color.blue);
botn.setForeground(Color.white);
// incorporamos el boton al frame
// importante: si no se hace esto no sera visible
add(botn);
// preparamos la escucha del boton
Escucha e = new Escucha();
// la registramos
botn.addActionListener(e);
// aadimos el "listener" para cerrar la ventana
addWindowListener(new ParaAcabar());
}
// escucha del botn
private class Escucha implements ActionListener {
public void actionPerformed(ActionEvent e) {
contador++;
etiq.setText("Has pulsado "+contador+" veces");
}
}
} // fin de la clase Ventana
// clase para cerrar la ventana
class ParaAcabar extends WindowAdapter {
142.
public void windowClosing(WindowEvent e) {System.exit(0);}
143. }
package ventanas;
import java.awt.*;
import java.awt.*;
import java.awt.event.*;
public class Ventana extends Frame {
// constructora
public Ventana() {
// titulo, estilo, tamao y posicin iniciales
setTitle("contadores ");
setLayout(new FlowLayout());
setSize(200, 100);
setLocation(100,50);
// le damos un poco de color a la ventana
setBackground(Color.yellow);
// las etiquetas
Font fuente = new Font("Arial", Font.PLAIN, 20);
Label etiq = new Label("Contador: ");
etiq.setFont(fuente);
add(etiq);
Label etiq2 = new Label("0");
etiq2.setFont(fuente);
add(etiq2);
// preparamos la escucha del boton
Escucha e = new Escucha(etiq2);
// creamos los botones
Button botonInc = new Button("Incremento");
botonInc.setActionCommand("inc");
botonInc.setBackground(Color.blue);
botonInc.setForeground(Color.white);
add(botonInc);
botonInc.addActionListener(e);
Button botonDec = new Button("Decremento");
botonDec.setActionCommand("dec");
botonDec.setBackground(Color.red);
botonDec.setForeground(Color.white);
add(botonDec);
botonDec.addActionListener(e);
// aadimos el "listener" para cerrar la ventana
addWindowListener(new ParaAcabar());
}
}
// clase para cerrar la ventana
class ParaAcabar extends WindowAdapter {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
}
// escucha del boton
class Escucha implements ActionListener {
int contador; // para contar las veces que se ha pulsado
Label etiqueta; // etiqueta que se modificar
public Escucha(Label etiqueta) {
this.etiqueta = etiqueta;
contador=0;
}
public void actionPerformed(ActionEvent e) {
if (e.getActionCommand().equals("inc"))
contador++;
else
contador--;
etiqueta.setText(" "+contador+" ");
}
}
Mtodos
La clase TextField coincide con las clases anteriores en la definicin de los
mtodos setText(String cadena) y String getText(). Algunos otros mtodos de inters:
Eventos
En cuanto a los eventos, la diferencia principal con la clase Button es que el
mtodo ActionEvent de la clase escucha se utiliza cuando se pulsa Enter. Tambin se puede
controlar cual es la tecla pulsada, como veremos al hablar de los eventos de teclado, pero
estos eventos no son especficos de la clase TextField sino comunes a todos los Component.
Ejemplo: Clase para representar una ventana de entrada a un sistema, con login y
password:
PalabraClave.java
package claves;
import java.awt.*;
import java.awt.event.*;
public class PalabraClave extends Frame {
private Label etiq,etiq2,etiq3;
private Button aceptar;
private TextField login;
private TextField pass;
public PalabraClave() {
// titulo, estilo, tamao y posicin iniciales
setTitle("Entrada al Sistema");
setLayout(new FlowLayout());
// ventana centrada
Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
int ancho=300, alto=200;
setSize(ancho, alto);
setLocation(d.width/2-ancho/2,d.height/2-alto/2);
// tipo de letra
Font fuente = new Font("Arial", Font.PLAIN, 18);
setFont(fuente);
// un poco de color
setBackground(Color.cyan);
// preparamos la entrada de datos
etiq = new Label("Login:
");
add(etiq);
login = new TextField(8);
add(login);
etiq2 = new Label("Password:");
etiq2.setFont(fuente);
add(etiq2);
pass = new TextField(10);
pass.setEchoChar('*');
add(pass);
aceptar = new Button("Aceptar");
add(aceptar);
etiq3 = new Label("Pulsa Aceptar para Continuar");
add(etiq3);
TextArea(): rea de texto con una cadena vaca. Tamao de alrededor de 55 filas por
15 columnas
TextArea(int filas, int columnas): Fija el nmero de filas y columnas. Si el nmero
excede el tamao del TextArea se incluyen automticamente las barras de
desplazamiento.
TextArea(String texto): Texto inicial.
TextArea(String texto, int filas, int columnas): Texto inicial con filas y columnas
prefijadas.
TextArea(String texto, int filas, int columnas, int barras): Aade al anterior la
posibilidad de controlar la existencia de barras de desplazamiento. Los posibles
valores de barras son:
o SCROLLBARS_BOTH
o SCROLLBARS_HORIZONTAL_ONLY
o SCROLLBARS_NONE
o SCROLLBARS_VERTICAL_ONLY
Mtodos y Eventos
Los mtodos y eventos son como los de TextField con algunos mtodos aadidos, entre los
que podemos destacar:
void replaceRange(String str, int start, int end) : Cambia el texto entre las
posiciones start y end por el texto str.
insert(String str, int pos): Inserta el texto en la posicin indicada.
append(String str): Aade el texto indicado al final.
La clase Checkbox nos permite mostrar texto acompaado de casillas con dos estados:
marcada o no marcada. Varios Checkbox pueden agruparse de forma que nos aseguremos
de que slo una casilla est marcada en cada momento. Vamos a ver las dos posibilidades
en dos ejemplos separados: Casillas no agrupadas
En este caso basta con declarar y aadir los Checkbox independientemente. La etiqueta
asociada a la casilla se puede fijar en la constructora o bien posteriormente con el
mtodo setLabel(String). El estado (activada o no) se puede modificar y consultar con los
mtodos setState(boolean) y getState(), respectivamente. El siguiente ejemplo muestra el
uso de este componente:
Ventana.java
import java.awt.*;
import java.awt.event.*;
public class Ventana extends Frame {
// la ventana contiene 4 casillas
private Checkbox casilla1,casilla2,casilla3,casilla4;
// dos etiquetas
Label etiq1, etiq2;
// y un botn
private Button aceptar;
public Ventana() {
// objeto de tipo ventana
setTitle("Prueba de Checkbox");
setSize(380, 150);
setLayout(new FlowLayout());
Font fuenteNegrita = new Font("Arial",Font.BOLD,16);
setFont(fuenteNegrita) ;
etiq1 = new Label("Marque sus aficiones favoritas y pulse Aceptar");
add(etiq1);
// una forma de construir una casilla
casilla1 = new Checkbox();
casilla1.setLabel("Deportes");
// otra forma
casilla2 = new Checkbox("Lectura");
casilla3 = new Checkbox("Viajes");
casilla4 = new Checkbox("Cine");
// hacemos que la casilla Cine aparezca marcada
casilla4.setState(true);
add(casilla1); add(casilla2); add(casilla3); add(casilla4);
aceptar = new Button("Aceptar");
add(aceptar);
// escucha del botn
aceptar.addActionListener(new EscuchaBotn());
// etiqueta donde se mostrar el resultado
etiq2 = new Label("");
// aadimos la escucha para cerrar la ventana
addWindowListener(new ParaAcabar());
}
//////////////////////////////////////////////////////
// escucha del boton
class EscuchaBotn implements ActionListener {
public void actionPerformed(ActionEvent e) {
String aficiones = "Ha elegido: ";
if (casilla1.getState()) aficiones += casilla1.getLabel()+"
if (casilla2.getState()) aficiones += casilla2.getLabel()+"
if (casilla3.getState()) aficiones += casilla3.getLabel()+"
if (casilla4.getState()) aficiones += casilla4.getLabel()+"
";
";
";
";
El resultado es:
Casillas agrupadas
Similar al anterior, pero agrupando las casillas por medio de un objeto
tipo CheckboxGroup, para lo que se usa una tercera constructora que permite indicar el
grupo al que pertenece la casilla, as como si est activa (cada grupo tendr como mximo
una casilla marcada). Los mtodos de CheckboxGroup Checkbox
getSelectedCheckbox() y void setSelectedCheckbox(Checkbox) sirven para obtener y
cambiar, respectivamente, el Checkbox seleccionado. Ejemplo:
Ventana.java
import java.awt.*;
import java.awt.event.*;
public class Ventana extends Frame {
// grupo de 3 casillas
private CheckboxGroup grupo;
private Checkbox c1,c2,c3;
// y una etiqueta
Label etiq1;
public Ventana() {
setTitle("Prueba de CheckboxGroup");
setSize(300, 80);
setBackground(Color.yellow);
setLayout(new FlowLayout());
Font fuenteNegrita = new Font("Arial",Font.BOLD,16);
setFont(fuenteNegrita) ;
etiq1 = new Label("Destino:");
add(etiq1);
// primero se construye el "agrupador"
grupo = new CheckboxGroup();
// ahora se crean las casillas indicando que estn en el grupo
c1 = new Checkbox("Madrid",grupo,false);
c2 = new Checkbox("Pars",grupo,false);
c3 = new Checkbox("Berln",grupo,true);
// aadir las casillas a la ventana; el grupo NO se aade
add(c1); add(c2); add(c3);
// aadimos la escucha para cerrar la ventana
addWindowListener(new ParaAcabar());
}
}
// clase escucha que se ejecuta al tratar de cerrar la ventana
class ParaAcabar extends WindowAdapter {
public void windowClosing(WindowEvent e) {
System.exit(0); // abandonar la aplicacin
}
}
El resultado es:
Por su parte, el parmetro de tipo KeyEvent contiene los siguientes mtodos que nos ayudan
a identificar la tecla concreta:
Ejemplo: Hacer que la posicin de una etiqueta cambie con las teclas de cursor. El
programa tambin avisar si se pulsa la tecla Bloq. Nm.
Teclas.java
import java.awt.*;
import java.awt.event.*;
public class Teclas extends Frame {
private Label etiq; // nico componente
public Teclas() {
// titulo, estilo, tamao y posicin iniciales
setTitle("Teclas");
setLayout(new FlowLayout());
// ventana centrada
Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
int ancho=300, alto=200;
setSize(ancho, alto);
setLocation(d.width/2-ancho/2,d.height/2-alto/2);
// tipo de letra
Font fuente = new Font("Arial", Font.PLAIN, 18);
setFont(fuente);
// un poco de color
setBackground(Color.cyan);
// preparamos la entrada de datos
etiq = new Label("Pulsa 'S' para salir
add(etiq);
");
} else {
// guardamos el cdigo de la tecla especial
int tecla = e.getKeyCode();
// la posicin actual de la etiqueta
Point pos = etiq.getLocation();
switch(tecla) {
case KeyEvent.VK_UP:
etiq.setLocation(pos.x,pos.y-1);
break;
case KeyEvent.VK_DOWN:
etiq.setLocation(pos.x,pos.y+1);
break;
case KeyEvent.VK_LEFT:
etiq.setLocation(pos.x-1,pos.y);
break;
case KeyEvent.VK_RIGHT:
etiq.setLocation(pos.x+1,pos.y);
break;
case KeyEvent.VK_NUM_LOCK:
etiq.setText("Bloque numrico");
break;
default:
}
}
}
// hay que incluir estos mtodos aunque no se necesiten
public void keyReleased(KeyEvent e) {
}
public void keyTyped(KeyEvent e) {
Ejemplo: Vamos a mover un botn para que el usuario no pueda pulsarlo nunca:
CorreRaton.java
import java.awt.*;
import java.awt.event.*;
public class CorreRaton extends Frame {
public CorreRaton() {
// titulo, estilo, tamao y posicin iniciales
setTitle("Botn tmido");
setLayout(new FlowLayout());
setBackground(Color.cyan);
// ventana centrada
Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
int ancho=300, alto=150;
setSize(ancho, alto);
setLocation(d.width/2-ancho/2,d.height/2-alto/2);
// preparamos la entrada de datos
Button botn = new Button("Plsame");
add(botn);
// escucha de teclado para la ventana
EscuchaRatn e = new EscuchaRatn(botn);
botn.addMouseListener(e);
// aadimos la escucha para cerrar la ventana
addWindowListener(new ParaAcabar());
// la mostramos
setVisible(true);
// si no hacemos esto el foco se lo queda la etiqueta!!!
requestFocus();
}
}
// clase para cerrar la ventana
class ParaAcabar extends WindowAdapter {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
}
class EscuchaRatn implements MouseListener {
Button botn;
// le pasamos el botn y el tamao de la pantalla
public EscuchaRatn(Button botn) {
this.botn = botn;
}
public void mouseEntered(MouseEvent e) {
Point p = botn.getLocation();
if (p.x<150) p.x = 160 + ((int)(Math.random()*120));
else p.x = 20 + ((int)(Math.random()*120));
p.y = 20 + ((int) (Math.random()*100));
botn.setLocation(p);
}
// no olvidar incluir estos mtodos!!
public void mouseClicked(MouseEvent e) {
}
public void mouseExited(MouseEvent e) {
}
public void mousePressed(MouseEvent e) {
}
public void mouseReleased(MouseEvent e) {
}
}
MouseMotionListener
Detecta los movimientos del ratn, y tambin cuando el ratn se arrastra pulsado (para
marcar zonas). Este interfaz tiene dos mtodos:
5.- Estilos
5.1 Introduccin
5.2 Estilo FlowLayout
5.3 Estilo BorderLayout
5.4 Estilo GridLayout
5.5 Paneles
5.1 Introduccin
El estilo (o diseo) de un contenedor indica cmo se dispondrn los componentes bsicos
en l.
Se establece mediante el mtodo void setLayout(LayoutManager l) de la clase Container.
La clase LayoutManager es la clase de la que heredan todos los estilos (layouts). Cada
contenedor tiene un estilo por defecto. Por ejemplo, en el caso de Frame este
es BorderLayout, y en el de Panel FlowLayout.
Observacin: Aunque cada contenedor tiene un nico estilo, podemos mezclar estilos
incorporando contenedores dentro de contenedores. La clase Panel est pensada con este
propsito.
Igual que en los puntos anteriores, aqu no vamos a ver todos los estilos de los que dispone
Java (hay 21 estilos diferentes!), contentndonos con ver algunos de los ms comunes y
esperando que sea suficiente para captar la "filosofa" y que a partir de stos comprender el
resto sea ms sencillo.
Ejemplo: Aadimos 10 botones para ver como se colocan en la ventana con FlowLayout
EstiloFlowLayout.java
import java.awt.*;
import java.awt.event.*;
public class EstiloFlowLayout extends Frame {
public EstiloFlowLayout() {
// titulo, estilo, tamao y posicin iniciales
setTitle("FlowLayout");
setBackground(Color.cyan);
setSize(300,200);
// componentes centrados a la derecha, con una distancia entre ellos
// de 20 pixels en x y 30 en y
setLayout(new FlowLayout(FlowLayout.RIGHT, 20,30));
// aadimos unos botones de pega
for (int i=0; i<10; i++)
add(new Button(" "+i+" "));
// aadimos la escucha para cerrar la ventana
addWindowListener(new ParaAcabar());
}
}
// clase para cerrar la ventana
class ParaAcabar extends WindowAdapter {
public void windowClosing(WindowEvent e) {System.exit(0); }
}
El resultado es:
Ejemplo
Ventana.java
import java.awt.*;
import java.awt.event.*;
public class Ventana extends Frame {
public Ventana() {
// titulo, estilo, tamao y posicin iniciales
setTitle("BorderLayout");
setBackground(Color.cyan);
setSize(300,200);
// componentes centrados a la derecha, con una distancia entre ellos
// de 20 pixels en x y 30 en y
setLayout(new BorderLayout());
// creamos 5 botones
Button este = new Button("Este");
este.setBackground(Color.blue);
Button oeste = new Button("Oeste");
oeste.setBackground(Color.red);
Button norte = new Button("Norte");
norte.setBackground(Color.yellow);
Button sur = new Button("Sur");
sur.setBackground(Color.green);
Button centro = new Button("Centro");
centro.setBackground(Color.pink);
// aadimos botones en cada zona
add(este, BorderLayout.EAST);
add(oeste, BorderLayout.WEST);
add(norte, BorderLayout.NORTH);
add(sur, BorderLayout.SOUTH);
add(centro); // equivalente a: add(centro, BorderLayout.CENTER);
// aadimos la escucha para cerrar la ventana
addWindowListener(new ParaAcabar());
}
}
// clase para cerrar la ventana
class ParaAcabar extends WindowAdapter {
public void windowClosing(WindowEvent e) { System.exit(0); }
}
El resultado es:
GridLayout(): Constructora por defecto: una sola fila y una sola columna; poco
usada.
GridLayout(int filas, int columnas): Nmero de filas y columnas.
GridLayout(int filas, int columnas, int sepHorizontal, int sepVertical): Adems del
tamao en filas y columnas indica la separacin horizontal y vertical entre los
componentes.
Ejemplo
Grid.java
import java.awt.*;
import java.awt.event.*;
public class Grid extends Frame {
public Grid() {
// titulo, estilo, tamao y posicin iniciales
setTitle("GridLayout");
setBackground(Color.yellow);
setSize(250,150);
// componentes en 4 filas, a 2 columnas,
// 10 pixels de separacin horizontal entre componentes
// y 5 pixels de separacin vertical
setLayout(new GridLayout(4,2,10,5));
add(new Label("Nombre: ", Label.RIGHT));
TextField nombre = new TextField(10);
add(nombre);
add(new Label("Apellidos: ", Label.RIGHT));
TextField apellidos = new TextField(20);
add(apellidos);
add(new Label("Direccin: ", Label.RIGHT));
TextField direccin = new TextField(30);
add(direccin);
Button continuar = new Button("Siguiente");
add(continuar);
Button abandonar = new Button("Cancelar");
add(abandonar);
// faltaran todas las escuchas para que el programa haga algo real
// aadimos la escucha para cerrar la ventana
addWindowListener(new ParaAcabar());
}
}
// clase para cerrar la ventana
class ParaAcabar extends WindowAdapter {
public void windowClosing(WindowEvent e) { System.exit(0);
}
El resultado es:
5.5 Paneles
La clase Panel representa un contenedor que no puede existir por su cuenta, slo insertado
en otro contenedor (como por ejemplo en un Frame(). Su estilo por defecto es FlowLayout,
aunque como en todos los contenedores se puede modificar con setLayout. Se utiliza a
menudo para combinar diferentes estilos en una misma ventana.
Ejemplo: Vamos a escribir el aspecto previo que tendra una aplicacin para jugar al
ajedrez; incluyendo el tablero vaco, un ttulo inicial y botones para comenzar y salir. El
resultado debe ser:
import java.awt.*;
import java.awt.event.*;
public class Tablero extends Frame {
public Tablero() {
// titulo, estilo, tamao y posicin iniciales
setTitle("Tablero");
setBackground(Color.green);
// ventana centrada
Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
int ancho=300, alto=350;
setSize(ancho, alto);
setLocation(d.width/2-ancho/2,d.height/2-alto/2);
// preparamos el layout de la ventana
setLayout(new BorderLayout(20,20));
// ponemos la etiqueta
Font fuente = new Font("Arial", Font.BOLD, 20);
Label etiq = new Label("A J E D R E Z ", Label.CENTER);
etiq.setFont(fuente);
etiq.setForeground(new Color(100,0,50));
add(etiq, BorderLayout.NORTH);
// preparamos el tablero; ser el panel central
Panel tablero = new Panel();
tablero.setLayout(new GridLayout(8,8));
for (int i=1; i<=8; i++)
for (int j=1; j<=8; j++)
if ((i+j) % 2 == 0) {
Button blanca = new Button(" ");
blanca.setBackground(Color.white);
blanca.setEnabled(false);
tablero.add(blanca);
}
else {
Button negra = new Button(" ");
negra.setBackground(Color.black);
negra.setEnabled(false);
tablero.add(negra);
}
// lo ponemos en el centro
add(tablero,BorderLayout.CENTER);
// tablero para los botones
Panel botones = new Panel();
Button empezar = new Button("Empezar");
Button acabar = new Button("Acabar");
// no dejamos que pulsen acabar si no se est jugando
acabar.setEnabled(false);
botones.add(empezar);
botones.add(acabar);
add(botones, BorderLayout.SOUTH);
// paneles para dejar margen a la izquierda y a la derecha
Panel izq = new Panel();
Panel der = new Panel();
add(izq,BorderLayout.EAST);
add(der,BorderLayout.WEST);
// aadimos la escucha para cerrar la ventana
addWindowListener(new ParaAcabar());
}
}
// clase para cerrar la ventana
class ParaAcabar extends WindowAdapter {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
}
6.- Dibujando
6.1 Introduccin
6.2 La clase Canvas
6.3 La clase Graphics
6.4 Mostrando imgenes
6.5 Un poco de animacin
6.1 Introduccin
Cmo dibujar?
Para dibujar en Java hay que conocer inicialmente los siguiente conceptos.
Los objetos capaces de dibujar son los de tipo Graphics (descritos en el punto 4.6.3).
Contienen mtodos para dibujar lneas, rectngulos, imgenes ledas de un fichero
(formato .gif o jpeg) etc.
Todo componente grfico contiene un objeto de tipo Graphics, que es el que usa para
"dibujarse" a si mismo.
Todo componente grfico incluye un mtodo Graphics getGraphics()
De todo esto se deduce que para dibujar podemos "pedirle prestado" su objeto Graphics() al
componente en el que queramos dibujar. Ejemplo: Botn subrayado (primera versin).
Ventana.java
import java.awt.*;
import java.awt.event.*;
public class Ventana extends Frame{
public Ventana() {
// titulo, estilo, tamao y posicin iniciales
setTitle("Botn con dibujo V.1");
setLayout(new FlowLayout());
Font fuente = new Font("Arial", Font.BOLD, 40);
setFont(fuente);
// ventana centrada
Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
int ancho=200, alto=90;
setSize(ancho, alto);
setLocation(d.width/2-ancho/2,d.height/2-alto/2);
Button botn = new Button("Aceptar");
add(botn);
// aadimos el "listener" para cerrar la ventana
addWindowListener(new ParaAcabar());
// la mostramos
setVisible(true);
// dibujamos sobre el botn
Graphics g = botn.getGraphics();
g.setColor(Color.green);
g.fill3DRect(5,40,70,10,true);
g.fill3DRect(80,40,90,10,true);
}
}
// clase para cerrar la ventana
class ParaAcabar extends WindowAdapter {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
}
El resultado es:
El problema est en que cada vez que se repinta el botn no se vuelve a pintar la lnea. De
hecho el dibujo slo se hace una vez, al estar en la constructora, y cada vez que hay que
pintar el botn.
El mtodo paint
Para arreglar este problema hay que saber algunas cosas ms.
import java.awt.*;
public class BotonSubrayado extends Button {
public BotonSubrayado(String nombre) {
super(nombre);
}
public void paint(Graphics g) {
// llamamos al pintar original
super.paint(g);
g.setColor(Color.green);
g.fill3DRect(5,40,70,10,true);
g.fill3DRect(80,40,90,10,true);
}
}
Ventana.java
import java.awt.*;
import java.awt.event.*;
public class Ventana extends Frame{
public Ventana() {
// titulo, estilo, tamao y posicin iniciales
setTitle("Botn con dibujo V.1");
setLayout(new FlowLayout());
Font fuente = new Font("Arial", Font.BOLD, 40);
setFont(fuente);
// ventana centrada
Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
int ancho=200, alto=90;
setSize(ancho, alto);
setLocation(d.width/2-ancho/2,d.height/2-alto/2);
BotonSubrayado botn = new BotonSubrayado("Aceptar");
add(botn);
// aadimos el "listener" para cerrar la ventana
addWindowListener(new ParaAcabar());
// la mostramos
setVisible(true);
Graphics g = botn.getGraphics();
g.setColor(Color.green);
g.fill3DRect(5,40,70,10,true);
g.fill3DRect(80,40,90,10,true);
}
}
// clase para cerrar la ventana
class ParaAcabar extends WindowAdapter {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
}
Ahora cada vez que haya que volver a pintar el botn se dibujar tambin la lnea
Ventana.java
import java.awt.*;
import java.awt.event.*;
public class Ventana extends Frame {
......
public Ventana() {
....
....
Lienzo l = new Lienzo();
add(l);
.......
......
}
}
......
Principal.java
public class Principal {
public static void main(String[] args) {
new Ventana();
}
}
Mtodos Principales
abstract
abstract
Anlogo al anterior.
abstract
se
Dibuja un rectngulo.
abstract
Color getColor()
Font getFont()
FontMetrics getFontMetrics(Font f)
void setColor(Color c)
void setPaintMode()
Al dibujar los pixels que sean del color de fondo se cambian al color del
parmetro y viceversa.
String toString()
t = new Image[10];
for
}
public void paint(Graphics g) {
g.drawImage(t[0],0,0, 200,200, Color.white, null);
}
public void saluda() {
Graphics g = getGraphics();
for (int i = 1; i<10; i++) {
g.drawImage(t[i],0,0,200,200, Color.white, null);
// perdemos un poco de tiempo para que se vea
try{ Thread.sleep(150);} catch(Exception e) {}
}
repaint();
}
}
Ventana.java
import java.awt.*;
import java.awt.event.*;
public class Ventana extends Frame {
public Ventana() {
// titulo, estilo, tamao y posicin iniciales
setTitle("saluda a los seores");
// ventana centrada
Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
int ancho=200, alto=250;
setSize(ancho, alto);
setLocation(d.width/2-ancho/2,d.height/2-alto/2);
// el lienzo ir en el centro de la pantalla
Saluda lienzo = new Saluda();
add(lienzo);
// el botn con su escucha correspondiente
Button boton = new Button("saluda!");
Escucha e = new Escucha(lienzo);
boton.addActionListener(e);
add(boton, BorderLayout.SOUTH);
// aadimos el "listener" para cerrar la ventana
addWindowListener(new ParaAcabar());
// la mostramos
setVisible(true);
}
}
// clase para cerrar la ventana
class ParaAcabar extends WindowAdapter {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
}
// escucha del boton
class Escucha implements ActionListener {
Saluda lienzo;
public Escucha(Saluda lienzo) {
this.lienzo = lienzo;
}
public void actionPerformed(ActionEvent e) {
lienzo.saluda();
}
}
Principal.java
public class Principal {
public static void main(String[] args) {
new Ventana();
}
}
escribir un mtodo que modifique estas variables y obligue al lienzo a repintarse para
simular la animacin.
Principal.java
Ventana.java
import java.awt.*;
import java.awt.event.*;
public class Ventana extends Frame {
public Ventana() {
// titulo, estilo, tamao y posicin iniciales
setTitle("Animacin - V1");
// ventana centrada
Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
int ancho=400, alto=250;
setSize(ancho, alto);
setLocation(d.width/2-ancho/2,d.height/2-alto/2);
// el lienzo ir en el centro de la pantalla
CorrePelota lienzo = new CorrePelota();
add(lienzo);
// aadimos el "listener" para cerrar la ventana
addWindowListener(new ParaAcabar());
// la mostramos
setVisible(true);
// buclew de animacin
for (long i=0; i<10000000; i++) {
// mover la pelota
lienzo.correCorre();
// perder el tiempo
try { Thread.sleep(10); } catch(Exception e) {}
}
}
}
// clase para cerrar la ventana
CorrePelota.java
import java.awt.*;
public class CorrePelota extends Canvas {
private final int radio = 30;
int x = 20,y = 20; // pos. inicial
int incX = 1, incY = 1; // dir. inicial
public CorrePelota() {
setBackground(Color.black);
setForeground(Color.yellow);
}
public void correCorre() {
// calculamos la nueva posicin de la pelota
x += incX; y += incY;
// si hay choque invertimos la direccin
if (x>370)
incX = -((int) (Math.random()*2+1));
if (x<0)
incX = (int) (Math.random()*2+1);
if (y>190)
incY = -((int) (Math.random()*2+1));
if (y<0)
incY = (int) (Math.random()*2+1);
repaint();
}
public void paint(Graphics g) {
g.fillOval(x,y,radio,radio);
}
}
El programa funciona, pero la pelota al moverse tiene un extrao "parpadeo". Vamos a ver
como solucionarlo.
Yo me lo pinto y yo me lo borro
El problema es que antes de pintar el nuevo dibujo debe borrarse el anterior; y de eso se
encarga update, que antes de llamar a paint borra el lienzo completo.
Como esto tarda en hacerse en ocasiones el refresco de pantalla "pilla" a la animacin justo
despus de borrar la figura pero antes de volver a dibujarla y eso provoca el parpadeo. Una
solucin es impedir que update() borre la figura anterior y en su lugar hacerlo nosotros, que
en lugar de borrar todo el grfico slo borraremos la figura anterior.
Para hacer esto slo tenemos que modificar la clase CorrePelota:
CorrePelota.java
import java.awt.*;
public class CorrePelota extends Canvas {
private final int radio = 30;
int x = 20,y = 20; // pos. inicial
int incX = 1, incY = 1; // dir. inicial
int antx, anty; // posicin antigua de la pelota
public CorrePelota() {
setBackground(Color.black);
setForeground(Color.yellow);
}
public void correCorre() {
// guardamos la posicin antigua para borrarla
antx = x; anty = y;
// calculamos la nueva posicin de la pelota
x += incX; y += incY;
// si hay choque invertimos la direccin
if (x>370)
incX = -((int) (Math.random()*2+1));
if (x<0)
incX = (int) (Math.random()*2+1);
if (y>190)
incY = -((int) (Math.random()*2+1));
if (y<0)
incY = (int) (Math.random()*2+1);
repaint();
}
public void update(Graphics g) {
paint(g);
}
public void paint(Graphics g) {
// borramos la anterior
g.clearRect(antx,anty,radio,radio);
g.fillOval(x,y,radio,radio);
}
}
Observacin: En swing existen mtodos especficos para tratar el doble buffer que
permiten mostrar animaciones de mejor calidad.
7.- Applets
7.1 Qu es un Applet?
7.2 Pginas WEB
7.3 Vida (y muerte) de un Applet
7.4 Ejemplo
7.1 Qu es un Applet?
Un applet es un programa Java que se ejecuta dentro de una pgina html. El cdigo (.class)
viaja junto con la pgina al ordenador del usuario, donde es ejecutado por la mquina
virtual del explorador correspondiente.
Observacin: Para que se pueda ver el applet dentro de la pgina hay que tener activada
la mquina virtual de Java del explorador
Los applets son especialmente utilizados en pginas de tipo cientfico y pedaggicas, para
ilustrar conceptos, simular experimentos. Un ejemplo tpico es cuando en nuestra pgina
queremos mostrar un grfica que depende de ciertos parmetros introducidos por el usuario.
pagina.html
<html>
<head>
<title> Una pgina </title>
</head >
<body >
Esta es una pgina mnima
</body>
</html>
Podemos escribir este texto en un fichero (por ejemplo con el block de notas), grabarlo y
abrirlo con el explorador. En general una pgina html puede contener:
Sin embargo no puede incluir acciones dinmicas, como por ejemplo pedir datos al usuario,
procesarlos y mostrar el resultado, o mostrar una animacin
Incluyendo Java en pginas WEB
La llamada al cdigo java se introduce mediante el delimitador html applet
<html>
<head>
<title> Un mini-applet </title>
</head >
<body >
Aqu incluimos una llamada al applet: <p>
<applet code=Mini.class" width=150 Height=25></applet> <p>
Y luego seguimos con el texto de la pgina
</body>
</html>
El resultado es:
pgina. para solucionar esto se utilizan hebras (Threads) que se ejecutan de forma
concurrente sin bloquear la pgina.
3. stop(): Se ha detenido el applet. Se puede volver a iniciar con start().
4. destroy(): Limpieza final y eliminacin del applet.
7.4 Ejemplo
El siguiente ejemplo mueve un dibujo ''cab.gif'' por la pantalla. Usa hebras (que no han sido
explicadas en clase: interfaz Runnable y funcin run()).
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
public class Imagen extends Applet implements Runnable{
Image coche;
int x=600,y=20;
Thread corre = new Thread(this);
//Inicializar el applet
public void init() {
Dado que los dilogos son un tipo especial de ventanas, no tenemos que describir sus
mtodos, tan slo sus constructoras:
Constructoras
Donde vent es la ventana madre, msg es el ttulo del cuadro de dilogo y mode debe ser o
bien FileDialog.LOAD si el dilogo se utiliza para abrir un fichero o FileDialog.SAVE si se
utiliza para grabar un fichero.
Mtodos
import java.awt.*;
import java.awt.event.*;
public class Ventana extends Frame {
public Ventana() {
setTitle("Entrada de datos");
setLayout(new FlowLayout());
setSize(300,100);
setLocation(300,200);
Label etiqInfo = new Label("Fichero seleccionado: ");
Label etiqSel = new Label();
add(etiqInfo);
add(etiqSel);
// aadimos el "listener" para cerrar la ventana
addWindowListener(new ParaAcabar());
// la mostramos
setVisible(true);
// creamos un dialogo para abrir un fichero
FileDialog fd = new FileDialog(this, "Abrir...",FileDialog.LOAD);
// al abrir el dialogo, como es modal, la aplicacin queda
// bloqueada
fd.setVisible(true);
String fname = fd.getFile();
// si el usuario ha cancelado el dialogo se devuelve null
if (fname != null) {
String fdir = fd.getDirectory();
String name = fdir + fname;
// mostramos el nombre elegido en la ventana
etiqSel.setText(name);
} // if
}
}
// clase para cerrar la ventana
class ParaAcabar extends WindowAdapter {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
}
showConfirmDialog: Dilogo para pedir confirmacin, como los tpicos dilogos con
los botones si/no/cancelar.
showInputDialog: Para pedir una entrada de datos al usuario.
showMessageDialog: Informacin para el usuario, con un botn de aceptar.
showOptionDialog: Combina las posibilidades de los tres anteriores.
Tambin hay 5 constantes que pueden utilizarse para indicar el tipo de mensaje que se est
mostrando. La seleccin de la constante adecuada influir en el icono que se presentar en
la ventana modal:
ERROR_MESSAGE
INFORMATION_MESSAGE
WARNING_MESSAGE
QUESTION_MESSAGE
PLAIN_MESSAGE
Por ltimo, aunque podemos incluir en el dilogo los botones que deseemos, hay 4
constantes que definen los conjuntos de botones ms usuales:
DEFAULT_OPTION YES_NO_OPTION YES_NO_CANCEL_OPTION OK_CANCE
L_OPTION
El primero muestra slo un botn de aceptar (el significado del resto es obvio a partir del
nombre). Vamos a ver algunos ejemplos en el siguiente programa:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*; // para JOptionPane
public class Ventana extends Frame {
public Ventana() {
setTitle("Entrada de datos");
setLayout(new FlowLayout());
setSize(200,100);
setLocation(300,200);
// el primer argumento es la ventana madre,
// el segundo el mensaje a mostrar, el tercero el titulo
// de la ventana y el cuarto el tipo de dialogo
JOptionPane.showMessageDialog(this,
"El fichero se ha grabado correctamente",
"informacion", JOptionPane.INFORMATION_MESSAGE);
// muestra el dialogo con un simbolo de interrogacion
if (JOptionPane.showConfirmDialog(null,
"desea salir de la aplicacion?", "aviso",
JOptionPane.YES_NO_OPTION) == 0)
System.exit(0);
// igual pero con un simbolo de informacion
JOptionPane.showConfirmDialog(this,
"Desea continuar?", "informacion",
JOptionPane.YES_NO_CANCEL_OPTION,
JOptionPane.INFORMATION_MESSAGE);
// para pedir un dato
String nombre =
JOptionPane.showInputDialog("Su nombre:");
// elegir un dato de una lista
Object[] valores = { "Norte","Sur", "Este","Oeste" };
Object selectedValue =
JOptionPane.showInputDialog(
null, // ventana madre
"Elige una direccion", // mensaje
"Direcciones", // titulo
JOptionPane.INFORMATION_MESSAGE, // tipo mensaje
null, // icono
valores, // valores
valores[0] // valor marcado inicialmente
);
// aadimos el "listener" para cerrar la ventana
addWindowListener(new ParaAcabar());
}
}
// clase para cerrar la ventana
class ParaAcabar extends WindowAdapter {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
}
Este programa muestra las siguientes ventanas de dilogo (consecutivamente, cada una tras
cerrar la anterior):