Documentos de Académico
Documentos de Profesional
Documentos de Cultura
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
Apndice A: Un poquito de Swing
1.- Introduccin
1.1 AWT y Swing
1.2 Un poco de filosofa
1.3 La jerarqua Component
posibilidades.
Se pueden distinguir, principalmente, 2 grupos de clases destinadas al diseo
de interfaces grficos en Java:
AWT
Swing
La primera (Abstract Window Toolkit) es la que vamos a estudiar en este
curso. El conjunto de clases Swing naci a partir de AWT, simplificando los
aspectos ms engorrosos de AWT, dando mayor flexibilidad al programador
para disear sus propios componentes grficos (gracias all uso de beans) e
incorporando numerosos componentes nuevos.
La pregunta que surge al leer esto es:
Si Swing es ms sencillo, ms flexible y ms potente que AWT,
por qu no limitarse a estudiar las clases de Swing?
Clase Component
Mtodo
Descripcin
String getName()
void setName(String)
Dimension1 getSize()
void setSize(Dimension)
Anlogo al anterior
Color getBackground
Color getForeground
void setFont(Font)
Boolean getVisible()
void setVisible(Boolean)
Boolean getEnabled()
void setEnabled(Boolean)
Graphics getGraphics()
repaint()
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
Clase
Descripcin
Panel
Applet
Window
Frame
Dialog
FileDialog
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);
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 {
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);
}
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);
}
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 {
System.exit(0); }
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);
}
}
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.
31.
32.
33.
34.
35.
36.
37.
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.
// creamos el boton
Button boton = new Button("Plsame");
boton.setBackground(Color.blue);
boton.setForeground(Color.white);
// incorporamos el boton al frame
// importante: si no se hace esto no sera visible
add(boton);
// preparamos la escucha del boton
Escucha e = new Escucha(etiq);
// la registramos
boton.addActionListener(e);
// aadimos el "listener" para cerrar la ventana
addWindowListener(new ParaAcabar());
// la mostramos
setVisible(true);
}
81.
82.
83.
Escribir la clase escucha dentro de la clase Ventana.
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.
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);
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
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);
}
// 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+" ");
texto.setSelectionStart(2);
texto.setSelectionEnd(5);
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);
// preparamos las escuchas
EscuchaAceptar e = new EscuchaAceptar();
aceptar.addActionListener(e);
pass.addActionListener(e);
// esta vale slo para el campo de login
EscuchaSiguiente pasaAlSiguiente = new EscuchaSiguiente();
login.addActionListener(pasaAlSiguiente);
// aadimos la escucha para cerrar la ventana
addWindowListener(new ParaAcabar());
}
// escuchas como subclases privadas ///////////////////////
// escucha del boton Aceptar
private class EscuchaAceptar implements ActionListener {
public void actionPerformed(ActionEvent e) {
if (vlidos(login.getText(), pass.getText()))
etiq3.setText("Datos vlidos");
else
etiq3.setText("Datos no vlidos");
}
private boolean vlidos(String login, String pass) {
// aqu se comprueba
return login.equals("Bertoldo") && pass.equals("nolose");
}
}
// clase escucha para el primer campo de edicin; le pasa el foco
// al siguiente
}
}
////////////////////// fin escuchas //////////////////////////////
} // Ventana
// clase para cerrar la ventana
class ParaAcabar extends WindowAdapter {
public void windowClosing(WindowEvent e) {System.exit(0);}
}
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()+"
";
";
";
";
}
}
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);
}
// 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:
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);
");
}
// clase para cerrar la ventana
class ParaAcabar extends WindowAdapter {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
}
// escucha de teclaro
class EscuchaTeclas implements KeyListener {
private Label etiq;
public EscuchaTeclas(Label etiq) {
this.etiq = etiq;
}
public void keyPressed(KeyEvent e){
if (e.isActionKey()==false && e.getKeyChar() == 'S') {
System.exit(0);
} 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:
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);
}
// 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:
void mouseMoved(MouseEvent e): El ratn se ha movido sin estar
pulsado
void mouseDragged(MouseEvent e): El ratn se ha movido estando
pulsado.
5.- Estilos
5.1 Introduccin
5.2 Estilo FlowLayout
5.3 Estilo BorderLayout
5.4 Estilo GridLayout
5.5 Paneles
5.1 Introduccin
import java.awt.*;
import java.awt.event.*;
El resultado es:
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);
}
// clase para cerrar la ventana
class ParaAcabar extends WindowAdapter {
public void windowClosing(WindowEvent e) { System.exit(0); }
}
El resultado es:
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
}
// clase para cerrar la ventana
class ParaAcabar extends WindowAdapter {
public void windowClosing(WindowEvent e) { System.exit(0);
}
El resultado es:
5.5 Paneles
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());
}
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);
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.
Cuando un objeto necesita repintarse, llama a su mtodo public void
update(Graphics g).
El comportamiento por defecto de update es:
o Borrar el componente.
o Llamar al mtodo public void paint(Graphics g) para dibujarlo
de nuevo.
Nosotros no podemos llamar a estos mtodos directamente; pero
podemos pedir a un componente que se "repinte" con el mtodo public
void repaint().
As pues, la solucin est en sobreescribir el mtodo paint() del componente
en el que queremos dibujar; y para ello deberemos hacer una nueva clase que
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
abstract
donde
estar situada la esquina superior izquierda del dibujo
y bgcolor el fondo que se mostrar en la parte transparente
de la imagen. El parmetroobserver indica un objeto al
que se va avisando cuando segn se va mostrando la
imagen. Nosotros lo lo utilizaremos y lo pondremos a null.
abstract
Anlogo al anterior.
abstract
Dibuja un rectngulo.
abstract
void finalize()
Color getColor()
Font getFont()
abstract
void setColor(Color c)
void setPaintMode()
}
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);
}
Principal.java
public class Principal {
public static void main(String[] args) {
new Ventana();
}
}
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
class ParaAcabar extends WindowAdapter {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
}
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;
repaint();
repaint();
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();
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:
Texto (se incluye el texto sin ms)
Imgenes (Ej.: <img src="dibu.jpg"> para incluir dibu.jpg en la
pgina )
Enlaces a otras pginas (Ej.: Si incluimos <a
href="http://www.ucm.es">ucm</a> aparecer la palabra ucm y al
pulsar sobre ella se saltar a la pgina de la universidad complutense).
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:
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() {
MediaTracker tracker = new MediaTracker(this);
coche = getImage(getCodeBase(),"cab.gif");
tracker.addImage(coche, 1);
try { tracker.waitForAll();} catch(Exception e)
{e.printStackTrace();}
this.setBackground(Color.white);
}
Dado que los dilogos son un tipo especial de ventanas, no tenemos que
describir sus mtodos, tan slo sus constructoras:
Constructoras
Dialog(Frame prop): Crea un dilogo no visible (hasta que se
haga setVisible(true)), no modal y con ttulo vaco. prop es el nombre
del dilogo o la ventana propietaria. Si se desea se puede poner null
para indicar que no tiene ventana "madre".
Dialog(Frame prop, String titulo): Anlogo al anterior pero indicando
el ttulo.
Dialog(Frame prop, String titulo, boolean modal):
Si modal es true crea una ventana modal.
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);
}
}
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_CANCEL_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
);
}
// clase para cerrar la ventana
class ParaAcabar extends WindowAdapter {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
}