Sei sulla pagina 1di 254

GUI JAVA

2013 - I Mg. Nehil Muoz C.


Interfaces Grficas
Una interfaz es un medio que permite que dos entidades
se comuniquen.
En una interfaz de usuario una de las entidades es una
persona y la otra un sistema que el usuario intenta
controlar.
El sistema puede ser una herramienta, un automvil o
cualquier dispositivo electrnico, en particular una
computadora.
En una computadora el usuario ejecuta acciones como
oprimir teclas o el botn del mouse y estas acciones son
percibidas por la interfaz del sistema.
Interfaces Grficas

Antes de los 90 se utilizaban interfaces de lneas de


comandos.
El usuario ingresaba comandos con una sintaxis muy
rigurosa usando el teclado.
Interfaces Grficas

Las interfaces grficas de usuario (GUI) explotan la


capacidad de las computadoras para reproducir
imgenes y grficos en pantalla y brindan un ambiente
ms amigable, simple e intuitivo.
interfaz: medio de comunicacin entre entidades.
grfica: incluye ventanas, menes, botones, texto,
imgenes.
usuario: persona que usa la interfaz para controlar un
sistema
interfaz (superficie de contacto)
Conexin fsica y funcional entre dos aparatos o sistemas independientes.
Interfaces Grficas
Modelo Escritorio

conos
Ventanas
Menes descolgables
Texto e imgenes organizadas en redes
Manipulacin arrastrar y soltar
Interfaces Grficas

conos
Interfaces Grficas
Una ventana es una porcin de la pantalla que sirve
como una pantalla ms pequea
Interfaces Grficas

Ventanas Solapadas
Interfaces Grficas

Men Desplegable
Interfaces Grficas
Un men es una lista de opciones alternativas
ofrecidas al usuario
Interfaces Grficas
Los 90
Interfaces Grficas
Escritorio 2D
Interfaces Grficas
Escritorio 3D
Interfaces Grficas
Interfaces Grficas

Una GUI es una coleccin de componentes con una


representacin grfica y capacidad para percibir
eventos generados por las acciones del usuario.
Las componentes son las partes individuales a partir de
las cuales se conforma una interfaz grfica. Por
ejemplo, el botn para cerrar una ventana, la barra
de desplazamiento de una ventana y la ventana
misma.
Interfaces Grficas

Un usuario realiza una accin que genera un evento


ante el cual una componente tiene una reaccin.
Una componente est asociada a un objeto grfico
que puede interactuar con el usuario. Un objeto grfico
es una instancia de una clase grfica.
Algunos de los atributos de un objeto grfico son
atributos grficos y parte del comportamiento ofrece
servicios grficos.
Interfaces Grficas

Algunos componentes son contenedores de otros


componentes.
Un contenedor tiene atributos especiales como por
ejemplo el layout o diagramado de acuerdo al cual se
organizan las componentes contenidas.
Una ventana es un contenedor de alto nivel.
Un frame es un tipo especial de ventana sobre el que
puede ejecutarse una aplicacin.
Interfaces Grficas

La construccin de una GUI requiere:


disear la interfaz de acuerdo a las especificaciones
implementar la interfaz usando las facilidades
provistas por el lenguaje.
Interfaces Grficas
Diseo de una GUI

El diseo de una interfaz grfica abarca tres


aspectos:
Definir las componentes
Organizar las componentes estableciendo el
layout o diagramado de las componentes
contenedoras
Decidir cmo reacciona cada componente ante
las acciones realizadas por el usuario.
Interfaces Grficas
Implementacin de una GUI
La implementacin de una interfaz grfica
consiste en:
crear un objeto grfico para cada componente
de la GUI e insertarlo en otras componentes
contenedoras.
definir el comportamiento de las componentes
reactivas en respuesta a las acciones del usuario.
El diseo es una etapa fundamental, pero nuestro
objetivo en esta materia no va a ser disear
interfaces grficas sino implementar el diseo de
una GUI
Interfaces Grficas en Java
Implementacin de una GUI
La implementacin de una GUI en Java se realiza
usando un paquete grfico.
Un paquete grfico brinda clases generales a
partir de las cuales es posible crear objetos
grficos o bien definir nuevas clases ms
especficas a partir de las cuales crear objetos.
El mecanismo de manejo de eventos provisto por
Java permite combinar las clases que modelan los
aspectos especficos de un problema con las que
soportan la implementacin de la interfaz grfica.
Interfaces Grficas en Java
El desarrollo de software orientado a objetos
enfatiza la importancia de separar los aspectos
especficos del problema de aquellos que se
relacionan con la presentacin de los datos.
Si vamos a desarrollar un sistema para depositar y
extraer efectivo en un cajero automtico, separaremos
la clase que modela la cuenta bancaria de las que se
ocupan de la interfaz grfica.
Observemos que en lo que sigue integraremos la
mayora de los conceptos presentados en esta
materia: herencia, polimorfismo, ligadura dinmica
y encapsulamiento.
Interfaces Grficas en Java
Caso de Estudio: Cuenta Bancaria
Se desea modelar una cuenta bancaria sobre la
que se realizan depsitos, extracciones y
consultas de saldo.
La cuenta bancaria tiene asociado un cdigo y un
saldo. El cdigo la identifica unvocamente y es
fijo. El saldo aumenta cuando el titular de la
cuenta efecta un depsito y disminuye cuando
realiza una extraccin.
El usuario est autorizado a girar en descubierto
hasta un monto mximo establecido.
Interfaces Grficas en Java
Caso de Estudio: Cuenta Bancaria
El usuario opera con su cuenta bancaria a travs de una
aplicacin que se ejecuta sobre un frame como el que
sigue:
Interfaces Grficas en Java
Caso de Estudio: Cuenta Bancaria
Si el usuario presiona el botn Depositar en pantalla
aparece un cuadro de dilogo como el que sigue:

Si el usuario presiona el botn OK aparece en pantalla un


cuadro de dilogo
Interfaces Grficas en Java
Caso de Estudio: Cuenta Bancaria
Anlogamente si el usuario presiona el botn Extraer en
pantalla aparece un cuadro de dilogo como el que
sigue:

Si el usuario presiona el botn OK aparece en pantalla un


cuadro de dilogo
Interfaces Grficas en Java
Caso de Estudio: Cuenta Bancaria
Si el usuario presiona el botn Consultar Saldos en
pantalla aparece

O bien
Interfaces Grficas en Java
Caso de Estudio: Cuenta Bancaria
Cuenta_Bancaria GUI_CtaBancaria
<<atributos de la clase>> cuenta : CuentaBancaria
max_descubierto: real panelAcciones, panelSaldo : JPanel
<<atributos de la instancia>> consultarSaldo,
codigo : entero botonExtraer, botonDepositar :JButton
saldo : real
<<constructor>> <<constructor>>
Cuenta_Bancaria () GUI_CtaBancaria ()

<<comandos>>
depositar (mto : real)
extraer (mto : real) : boolean
La ejecucin comienza con la
<<consultas>> creacin de una instancia de
obtenerCod () : entero
GUI_CtaBancaria
obtenerSaldo () : real
descubierto () : boolean
Interfaces Grficas en Java
Caso de Estudio: Cuenta Bancaria
Para implementar esta interfaz grfica vamos a definir una
clase que extienda a la clase JFrame provista por el
paquete grfico Swing.

import java.awt.*;
import java.awt.event.*;
import javax.swing.border.*;
import javax.swing.*;
public class GUI_CtaBancaria extends JFrame {

public GUI_CtaBancaria() {

}
}
Interfaces Grficas en Java
Caso de Estudio: Cuenta Bancaria
Cada botn de la interfaz estn asociado a un objeto
grfico que tienen la facultad de reaccionar ante
acciones producidas por el usuario.

public class GUI_CtaBancaria
extends JFrame {


private JButton botonDepositar,
botonExtraer,
consultarSaldo ;

}
Interfaces Grficas en Java

Caso de Estudio: Cuenta Bancaria


Se crea un objeto grfico asociado a la componente de la
GUI.

botonDepositar = new JButton();


Interfaces Grficas en Java
Caso de Estudio: Cuenta Bancaria
Se establece la apariencia de la componente de la GUI,
envindole mensajes al objeto grfico asociado.

botonDepositar = new JButton();


botonDepositar.setText("Depositar");
botonDepositar.setPreferredSize
(new Dimension(124, 50));
botonDepositar.setSize(150, 50);
botonDepositar.setBorder
(BorderFactory.createCompoundBorder
(new LineBorder
(new java.awt.Color(0, 0, 0), 1, false),
null));
Interfaces Grficas en Java
Caso de Estudio: Cuenta Bancaria
Para que el botn tenga la capacidad de percibir la accin
del usuario, creamos un objeto oyente y lo registramos al
objeto grfico.
botonDepositar = new JButton();
botonDepositar.setText("Depositar");
botonDepositar.setPreferredSize
(new Dimension(124, 50));
botonDepositar.setSize(150, 50);
botonDepositar.setBorder
(BorderFactory.createCompoundBorder
(new LineBorder
(new java.awt.Color(0, 0, 0), 1, false),
null));
OyenteDep oDep = new OyenteDep();
botonDep.addActionListener(oDep);
Interfaces Grficas en Java
Caso de Estudio: Cuenta Bancaria
Otra parte de la implementacin consiste en escribir el
cdigo que especifica el comportamiento de cada objeto
reactivo.
private class OyenteDep implements ActionListener {
public void actionPerformed(ActionEvent event){
float dep;
String deposito;
JOptionPane dialogo = new JOptionPane();
deposito = dialogo.showInputDialog( "Ingrese la cantidad a
depositar" );
if ((deposito != null) && (deposito.length() > 0)){
dep = Float.parseFloat(deposito);
dialogo.showMessageDialog(null,"Usted deposit " + dep+
" pesos","Depsito", JOptionPane.PLAIN_MESSAGE
); cuenta.depositar(dep);
}
}
Interfaces Grficas en Java
Caso de Estudio: Cuenta Bancaria

En la implementacin de esta interfaz grfica


redefinimos en una clase interna el cdigo del
mtodo actionPerformed() provisto por
ActionListener.
La clase que modela la interfaz usa los servicios
provistos por la clase que modela la cuenta
bancaria propiamente dicha.

Cuenta_Bancaria GUI_CtaBancaria
Interfaces Grficas en Java
Caso de Estudio: Cuenta Bancaria
La aplicacin crea una instancia de la nueva clase.
La ejecucin comienza creando una instancia de la clase
GUI_CtaBancaria, esto es, creando un frame.
import
class TestCtaBancaria
public static void main {
(String[] args) {
GUI_CtaBancaria unaCuenta ;
unaCuenta = new GUI_CtaBancaria();
unaCuenta.setVisible(true);
}
}
Interfaces Grficas en Java
Un frame es un tipo particular de ventana sobre
la que es posible ejecutar una aplicacin

Podemos construir un frame creando un objeto de


la clase JFrame o de una clase ms especfica que
definimos a partir de JFrame
Interfaces Grficas en Java

Un frame es un objeto contenedor

Toda instancia de JFrame tiene atributos marco,


lnea de ttulo, algunos botones y un panel de
contenido
Interfaces Grficas en Java

import javax.swing.*;
class PrimerEjemplo {

public static void main(String args[ ]) {

JFrame f = new JFrame(Mi Aplicacin);


f.setSize(400, 300);
f.setVisible(true);
}
}

Creamos directamente una instancia de JFrame


Interfaces Grficas en Java

import javax.swing.*;
class PrimerEjemplo {

public static void main(String args[ ]) {

JFrame f = new JFrame();


f.setTitle (Mi Aplicacin);
f.setSize(400, 300);
f.setVisible(true);
}
}

En este caso usamos el constructor sin


parmetros y establecemos el ttulo luego
Interfaces Grficas en Java

JFrame f = new JFrame(Mi Aplicacin);


f.setSize(400, 300);
f.setVisible(true);

La variable f mantiene una referencia a un objeto


de clase JFrame y puede recibir cualquiera de los
mensajes provistos por esa clase (o sus clases
ancestro)
Interfaces Grficas en Java

setSize(400,300)
(Dimension) establece el ancho y la altura de la
ventana.

setVisible(true)
(Component) el parmetro indica si la ventana se muestra o
no.
Interfaces Grficas en Java

Una alternativa ms adecuada es definir una nueva clase


que extiende a JFrame

class MiVentana extends JFrame{


public MiVentana() {
super(Segundo Ejemplo");
setSize(400, 300);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
}

import javax.swing.*;
public class SegundoEjemplo {
public static void main(String args[ ]) {
MiVentana f= new MiVentana();
f.setVisible(true);
}
}
Interfaces Grficas en Java

La variable f mantiene una referencia a un objeto de


clase MiVentana
El objeto est caracterizado por los atributos y
servicios de MiVentana, JFrame y de sus
ancestros en la jerarqua
Como los mensajes setSize y
setDefaultCloseOperation son enviados desde
el constructor de una ventana no es necesario indicar
el objeto receptor.
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE)
(JFrame) el parmetro indica qu hacer cuando la
ventana se cierra, en este caso terminar la
aplicacin.
Interfaces Grficas en Java

Un objeto de clase JFrame tiene varios atributos,


entre ellos el panel de contenido.
En lugar de acceder directamente al frame, vamos
a trabajar sobre el panel de contenido.
Por ejemplo cuando establecemos el color del
fondo o insertamos componentes

getContentPane().setBackground(col);

getContentPane().add(etiqueta);
Interfaces Grficas en Java

import java.awt.*;
import javax.swing.*;
class MiVentanaColor extends JFrame{
JLabel etiqueta;
public MiVentanaColor (String titulo,
Color col) { Panel de
super(titulo); contenido
setSize(400, 300);

getContentPane().setBackground(col);

etiqueta = new JLabel("Panel de contenido");


getContentPane().add(etiqueta);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
}
Interfaces Grficas en Java

import java.awt.*;
class TercerEjemplo {
public static
void main(String args[ ]) {
MiVentanaColor f1= new
MiVentanaColor(Una ventana,
Color.BLUE);
f1.setVisible(true);

MiVentanaColor f2= new


MiVentanaColor(Otra ventana,
Color.RED);
f2.setVisible(true);
}
}
Interfaces Grficas en Java
import java.awt.*;
import javax.swing.*;
class MiVentanaColor extends JFrame{
JLabel etiqueta;
public MiVentanaColor (String titulo,
Color col) {
super(titulo);
setSize(400,300);

getContentPane().setBackground(col);

etiqueta = new JLabel("Panel de contenido");


getContentPane().add(etiqueta);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
}
Mensajes enviados al objeto de clase
MiVentanaColor que se est construyendo
Interfaces Grficas en Java
getContentPane()
mensaje enviado al objeto de clase
MiVentanaColor para requerir el panel de
contenido, retorna un objeto de clase Container
getContentPane().setBackground(col);
getContentPane().add(etiqueta);
mensajes enviados al panel de contenido ( de clase
Container) para establecer valores de atributos o
agregar componentes
Container panel = getContentPane();
panel.setBackground(col);
panel.add(etiqueta);
Interfaces Grficas en Java

import java.awt.*;
import javax.swing.*;
public class MiVentanaColor extends JFrame{
JLabel etiqueta;
Container panel;
public MiVentanaColor(String titulo,
Color col) {
super(titulo);
setSize(400, 300);
etiqueta =new JLabel(Panel de contenido");
panel = getContentPane();
panel.setBackground(col);
panel.add(etiqueta);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
}
Interfaces Grficas en Java

Cada componente de la interfaz, en este caso la


etiqueta y el panel de contenido, queda asociada a
un objeto con una representacin grfica.
Los atributos de la clase mantienen justamente
referencias a estos objetos.
En este caso son objetos pasivos, no reaccionan ante
las acciones del usuario.
Las componentes activas en los ejemplos de la clase
de hoy reaccionan con un comportamiento
establecido por las clases provistas por Swing y AWT.
Por ejemplo la barra de ttulo cuando arrastramos el
mouse o los botones para minimizar, maximizar y
cerrar.
Interfaces Grficas en Java
import java.awt.*;
import javax.swing.*;
public class MiVentanaColor extends JFrame{
JLabel etiqueta;
Container panel;
public MiVentanaColor(String titulo,
Color col) {
super(titulo);
initGUI (titulo,col);
}

}
Adoptamos la convencin de que el constructor
invoca al constructor de la clase base y luego invoca
a un mtodo provisto por la misma clase que realiza
el resto de la inicializacin.
Interfaces Grficas en Java

void initGUI (String titulo, Color col){


etiqueta = new JLabel(Panel de contenido");
panel = getContentPane();
panel.setBackground(col);
panel.add(etiqueta);
setSize(400, 300);
setDefaultCloseOperation(EXIT_ON_CLOSE);
}
Caso de Estudio: Fondo Rojo - Verde
Desarrolle una aplicacin que permita establecer el color de
fondo de una ventana. El color ser rojo o verde de acuerdo
al botn que se apriete.
La ventana inicialmente debe aparecer as:

ste es el aspecto cuando se aprieta rojo o verde:


Caso de Estudio: Fondo Rojo - Verde

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class GUIFondoRojoVerde extends JFrame{

private JButton botonRojo, botonVerde;


}
botonRojo y botonVerde mantendrn referencias a
objetos grficos
Caso de Estudio: Fondo Rojo - Verde

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class GUIFondoRojoVerde extends JFrame{

private JButton botonRojo, botonVerde;

Ambos objetos son adems objetos fuentes de evento, estn


asociados a componentes reactivas de la GUI
Caso de Estudio: Fondo Rojo - Verde

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class GUIFondoRojoVerde extends JFrame{

private JButton botonRojo, botonVerde;


public GUIFondoRojoVerde() {

hacerGUI();

}

}
Caso de Estudio: Fondo Rojo - Verde

private void hacerGUI (){


botonRojo = new JButton("Rojo");

Se crea un objeto fuente de evento de clase


JButton
El objeto fuente de evento debe quedar vinculado a
un objeto oyente que acte de acuerdo al
comportamiento esperado para el botn rojo.
Caso de Estudio: Fondo Rojo - Verde

private void hacerGUI (){


botonRojo = new JButton("Rojo");
OyenteBotonR ponerRojo = new OyenteBotonR();

Se crea un objeto oyente de clase OyenteBotonR

En la clase OyenteBotonR definimos el


comportamiento esperado para el botn Rojo
Caso de Estudio: Fondo Rojo - Verde

private void hacerGUI (){


botonRojo = new JButton("Rojo");
OyenteBotonR ponerRojo = new OyenteBotonR();
botonRojo.addActionListener(ponerRojo);

Se vinculan los dos objetos, esto es, se registra el


objeto oyente al objeto fuente de evento.

La componente de la GUI asociada al objeto fuente


de evento, el botn rojo en este caso, pasa a ser
reactivo: percibe la accin del usuario y reacciona
de acuerdo al comportamiento especificado en la
clase OyenteBotonR
Caso de Estudio: Fondo Rojo - Verde

private void hacerGUI (){


botonRojo = new JButton("Rojo");
OyenteBotonR ponerRojo = new OyenteBotonR();
botonRojo.addActionListener(ponerRojo);

getContentPane().add(botonRojo);
Cuando se oprima el botn Rojo la
reaccin depende del comportamiento
que establece la clase OyenteBotonR

Se agrega el botn en el contenedor


Caso de Estudio: Fondo Rojo - Verde

private void hacerGUI (){


botonRojo = new JButton("Rojo");
OyenteBotonR ponerRojo = new OyenteBotonR();
botonRojo.addActionListener(ponerRojo);

getContentPane().add(botonRojo);

botonVerde = new JButton("Verde");


OyenteBotonV ponerVerde = new OyenteBotonV();
botonVerde.addActionListener(ponerVerde);

getContentPane().add(botonVerde);

}
Caso de Estudio: Fondo Rojo - Verde

private void hacerGUI (){


botonRojo = new JButton("Rojo");
OyenteBotonR ponerRojo = new OyenteBotonR();
botonRojo.addActionListener(ponerRojo);

getContentPane().add(botonRojo);

botonVerde = new JButton("Verde");


OyenteBotonV ponerVerde = new OyenteBotonV();
botonVerde.addActionListener(ponerVerde);

getContentPane().add(botonVerde);

}
Ambos botones son objetos fuente de evento y cada uno
est ligado a un objeto oyente.
Caso de Estudio: Fondo Rojo - Verde

private void hacerGUI (){
botonRojo = new JButton("Rojo");
OyenteBotonR ponerRojo = new OyenteBotonR();
botonRojo.addActionListener(ponerRojo);

}
class OyenteBotonR implements ActionListener {
public void actionPerformed( ActionEvent event) {
getContentPane().setBackground(Color.red);}
}
}

}
Caso de Estudio: Fondo Rojo - Verde

El evento externo provocado por la accin del


usuario al oprimir el botn Rojo, es detectado por el
objeto fuente de evento.

El objeto fuente de evento detecta el evento


externo y dispara un evento interno, esto es, se
crea un objeto implcitamente de la clase
ActionEvent.
La definicin de la clase OyenteBotonR incluye la
redefinicin del mtodo actionPerformed que
recibe como argumento el objeto evento creado
implcitamente.
Caso de Estudio: Fondo Rojo - Verde

private void hacerGUI (){

botonVerde = new JButton(Verde");


OyenteBotonV ponerVerde = new OyenteBotonV();
botonVerde.addActionListener(ponerVerde);

class OyenteBotonV implements ActionListener {


public void actionPerformed( ActionEvent event) {
getContentPane().setBackground(Color.green);}
}
}
}
Caso de Estudio: Fondo Rojo - Verde
public class GUIFondoRojoVerde extends JFrame{

class OyenteBotonR implements ActionListener {

public void actionPerformed( ActionEvent event) {


getContentPane().setBackground(Color.red); }
}

class OyenteBotonV implements ActionListener {

public void actionPerformed( ActionEvent event) {


getContentPane().setBackground(Color.green);}
}
}
Cada oyente tiene su propio mtodo actionPerformed
que establece el comportamiento de la componente
reactiva de la interfaz.
Cada clase interna tiene acceso al panel de contenido.
Caso de Estudio: Fondo Rojo - Verde

El programador redefine el mtodo


actionPerformed que no va a ser invocado
explcitamente por l mismo, sino que el mensaje
que provoca su ejecucin est incluido en algn
mtodo definido en una clase provista por Java.
Esto es, el programador define (o redefine) un
mtodo que l mismo NUNCA VA A INVOCAR al
menos explcitamente!
El mtodo recibe como argumento un objeto que
tampoco ha sido creado explcitamente por el
programador.
Caso de Estudio: Fondo Rojo - Verde

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class GUIFondoRojoVerde extends JFrame
{
private JButton botonRojo, botonVerde;
public GUIFondoRojoVerde() {
setLayout(new FlowLayout());
setSize(200, 120);
setDefaultCloseOperation
(EXIT_ON_CLOSE);
hacerGUI();
}
}
Caso de Estudio: Fondo Rojo - Verde
class Test{
public static void main(String[] args) {

GUIFondoRojoVerde cuadro =
new GUIFondoRojoVerde();
cuadro.setVisible(true);
}
}
Caso de Estudio: Fondo Rojo - Verde

Observemos que estamos considerando tres tipos


de objetos:

Los objeto fuente del evento


Los objetos evento
Los objetos oyentes (listeners)
Caso de Estudio: Fondo Rojo - Verde
Los objetos fuente del evento, estn asociados a una
componente de la interfaz, tienen una representacin
grfica y son capaces de percibir y reaccionar ante un
evento externo provocado por una accin del usuario y
disparar eventos de software.
Los objetos evento que son disparados
implcitamente por un objeto fuente del evento.
Los objetos oyentes (listeners) que se ejecutan para
manejar un evento. La clase a la que pertenece un
objeto oyente brinda mtodos para manejar eventos, es
decir especifica el curso de accin a seguir en respuesta
a diferentes tipos de eventos.
Caso de Estudio: Fondo Rojo - Verde
En la programacin basada en eventos el programador:
crea objetos grficos, algunos de ellos son objetos fuente
de evento, reaccionan ante un evento externo creando
objetos evento
crea objetos oyentes cuya funcin va a ser manejar los
eventos que se producen
implementa los mtodos manejadores de eventos que
determinan el comportamiento de los objetos oyentes
Los objetos que corresponden al evento interno no son
creados explcitamente por el programador, no estn
asociados a una variable.
El flujo de ejecucin queda establecido fundamentalmente
por el orden de los eventos.
Caso de Estudio: Fondo Rojo - Verde

El objeto fuente de evento Cada evento interno est


dispara uno o ms asociado a un objeto evento
eventos internos creado implcitamente
Evento
Componente
reactiva

El usuario realiza una accin El objeto oyente recibe un


que genera un evento mensaje con el objeto evento
externo sobre un objeto como parmetro y en respuesta
fuente de evento a l ejecuta un mtodo definido
por la clase a la que pertenece.
Caso de Estudio: Fondo Rojo - Verde

La clase a la que pertenece el objeto oyente implementa


el mtodo actionPerformed(ActionEvent e)
El mtodo recibe el evento interno como parmetro.
El mtodo actionPerformed forma parte de la inteface
ActionListener que es implementada por las clases
OyenteBotonR y OyenteBotonV

Los objetos de las clases JButton, JTextField,


JComboBox, JRadioButton, JCheckBox, JMenuItem
reaccionan frente a un evento externo generando un objeto
evento de la clase ActionEvent.

Cada clase puede generar objetos evento de una clase


diferente.
Interfaces Grficas
76

Las interfaces grficas de usuario (GUI) explotan


la capacidad de las computadoras para reproducir
imgenes y grficos en pantalla y brindan un
ambiente ms amigable, simple e intuitivo.
interfaz: medio de comunicacin entre entidades.
grfica: incluye ventanas, menes, botones, texto,
imgenes.
usuario: persona que usa la interfaz para controlar
un sistema
Interfaces Grficas
77

Una GUI es una coleccin de componentes


con una representacin grfica y capacidad
para percibir eventos generados por las
acciones del usuario.
Las componentes son las partes individuales a
partir de las cuales se conforma una interfaz
grfica. Por ejemplo, el botn para cerrar una
ventana, la barra de desplazamiento de una
ventana y la ventana misma.
Interfaces Grficas
78

Un usuario realiza una accin que genera un


evento ante el cual una componente tiene
una reaccin.
Una componente est asociada a un objeto
grfico que puede interactuar con el usuario.
Un objeto grfico es una instancia de una
clase grfica.
Algunos de los atributos de un objeto grfico
son atributos grficos y parte del
comportamiento ofrece servicios grficos.
Interfaces Grficas en Java
79

Una de las razones por las cuales Java ha llegado


a ser tan popular es que brinda herramientas
adecuadas para facilitar la construccin de
interfaces grficas de usuario (GUI).
Un paquete grfico ofrece una coleccin de
clases que pueden ser usadas para:
crear objetos grficos asociados a las
componentes de la interfaz
definir clases ms especficas a partir de las
cuales se crearn componentes.
Interfaces Grficas en Java
80

Algunos componentes son contenedores de otros


componentes.
Una ventana es un contenedor de alto nivel.
Un frame es un tipo especial de ventana sobre el
que puede ejecutarse una aplicacin.
Un objeto grfico de clase JFrame tiene atributos
marco, panel de contenido y tres botones.
La clase JFrame est provista en el paquete Swing
y especializa a las clases Frame y Window
provistas en el paquete AWT.
Interfaces Grficas en Java
81

Java ofrece diferentes paquetes grficos para


soportar la implementacin de grficos y GUIs.
AWT(Abstract Window Toolkit) y Swing son
paquetes grficos independientes de la plataforma,
para desarrollar interfaces grficas. Ambos brindan
una coleccin de clases que pueden especializarse
para crear botones, cajas de texto, menes, etc.
Una de las ventajas de Swing sobre AWT es que
permite desarrollar aplicaciones con una apariencia
similar a la de la plataforma subyacente con muy
poco esfuerzo.
Swing no reemplaza a AWT sino que la usa y agrega
nuevas clases.
Interfaces Grficas en Java
82

El paquete Swing
Cada clase de Swing modela un tipo de
componente.

Los tipos de componentes pueden agruparse en:

controles bsicos
displays interactivos con informacin altamente
formateada
displays con informacin no editable
contenedores
Interfaces Grficas en Java
83

El paquete Swing: Controles Bsicos


Son componentes simples que se usan principalmente para
tomar la entrada del usuario y mostrar un estado simple.

JButton JCheckBox JComboBox JList

JMenu JRadioButton JSlider


Interfaces Grficas en Java
84
El paquete Swing: Displays interactivos con
informacin altamente formateada

JColorChooser JEditorPane JTextPane


Interfaces Grficas en Java
85
El paquete Swing: Displays con informacin
no editable

JLabel JProgressBar JSeparator JToolTip


Interfaces Grficas en Java
86

El paquete Swing: Contenedores


En toda interfaz hay al menos un componente contenedor

JApplet JFrame

JDialog
Interfaces Grficas en Java
87

El paquete Swing: Contenedores

JPanel

JScrollPane

JSplitPane JTabbedPane JToolBar


Interfaces Grficas en Java
88

El paquete Swing: Contenedores

JInternalFrame JLayeredPane

JRootPane
Interfaces Grficas en Java
89
La jerarqua de clases del paquete Swing

En esta jerarqua la relacin entre una clase derivada y una


clase base no siempre es de tipo isa.
Interfaces Grficas en Java
90
La jerarqua de clases del paquete Swing

javax.swing
Class JFrame
java.lang.Object
java.awt.Component
java.awt.Container
java.awt.Window
java.awt.Frame
javax.swing.JFrame

La clase Frame agrega a la clase Window el


marco, la lnea de ttulo y los botones
La clase JFrame agrega a Frame el panel de
contenido
Caso de Estudio: Contador
91

Desarrolle una aplicacin que permita establecer incrementar


o decrementar un contador de acuerdo al botn que oprima
el usuario. La ventana inicialmente debe aparecer as:

El valor va a ir cambiando a medida que se oprimen los


botones.
Caso de Estudio: Contador
92

class Test{
public static void main(String[] args) {

Contador cuadro = new Contador();


cuadro.setVisible(true);
}
}
Caso de Estudio: Contador
93

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Contador extends JFrame {

private int numero;


private JLabel numeroEtiqueta;
private JButton botonIncrementar,botonDecrementar;

public Contador() {
numero = 0;
setLayout(new FlowLayout());
setSize(200, 120);
setDefaultCloseOperation(EXIT_ON_CLOSE);
hacerGUI();
}
Caso de Estudio: Contador
94

private void hacerGUI(){


numeroEtiqueta = new JLabel("" + numero);
//Crea el boton incrementar, el oyente y lo registra
botonIncrementar = new JButton("Incrementar");
OyenteBotonI incrementar = new OyenteBotonI();
botonIncrementar.addActionListener(incrementar);
//Crea el boton decrementar, el oyente y lo registra
botonDecrementar = new JButton("Decrementar");
OyenteBotonD decrementar = new OyenteBotonD();
botonDecrementar.addActionListener(decrementar);
//inserta las componentes en el panel del frame
getContentPane().add(numeroEtiqueta);
getContentPane().add(botonIncrementar);
getContentPane().add(botonDecrementar);
}

}
Caso de Estudio: Contador
95

Diferentes clases de componentes requieren


diferentes clases de oyentes para manejar los
eventos internos que los objetos disparan.

Un botn dispara eventos llamados eventos de


accin que son manejados por oyentes de accin.

Es decir un objeto de clase JButton genera un


objeto de la clase ActionEvent que es enviado
como parmetro a un objeto de una clase que
implementa a la interface ActionListener.
Caso de Estudio: Contador
96
public class Contador extends JFrame {

private class OyenteBotonI implements ActionListener {
public void actionPerformed(ActionEvent event) {
numero++;
numeroEtiqueta.setText("" + numero);
}
}
private class OyenteBotonD implements ActionListener {
public void actionPerformed(ActionEvent event) {
numero--;
numeroEtiqueta.setText("" + numero);
}
}
}
Implementamos los oyentes a travs de clases internas.
Esta alternativa es sencilla pero solo es adecuada para GUI
simples.
Caso de Estudio: Contador
97

El programador redefine el mtodo


actionPerformed que no va a ser invocado
explcitamente por l mismo, sino que el mensaje
que provoca su ejecucin est incluido en algn
mtodo definido en una clase provista por Java.
Esto es, el programador define (o redefine) un
mtodo que l mismo NUNCA VA A INVOCAR al
menos explcitamente!
El mtodo recibe como argumento un objeto que
tampoco ha sido creado explcitamente por el
programador.
Caso de Estudio: Contador
98

Observemos que estamos considerando tres tipos


de objetos:

Los objeto fuente del evento


Los objetos evento
Los objetos oyentes (listeners)
Caso de Estudio: Contador
99

Los objetos fuente del evento, estn asociados a una


componente de la interfaz, tienen una representacin
grfica y son capaces de percibir y reaccionar ante un
evento externo provocado por una accin del usuario y
disparar eventos de software.
Los objetos evento que son disparados
implcitamente por un objeto fuente del evento.
Los objetos oyentes (listeners) que se ejecutan para
manejar un evento. La clase a la que pertenece un
objeto oyente brinda mtodos para manejar eventos, es
decir especifica el curso de accin a seguir en respuesta
a diferentes tipos de eventos.
Interfaces Grficas en Java
100

Algunos componentes son contenedores de


otros componentes.
Un frame es un tipo especial de contenedor
sobre el que puede ejecutarse una aplicacin.
Un frame es una instancia de la clase JFrame
y como tal tiene un atributo panel de
contenido.
El panel de contenido tiene un atributo
layout o diagramado de acuerdo al cual se
organizan las componentes contenidas.
Interfaces Grficas en Java
101
Layout
El layout de una ventana determina la apariencia
de la misma.
Un organizador de layout es un objeto que facilita
la distribucin de las componentes dentro de un
contenedor.
Algunas de las clases provistas para crear
organizadores son BorderLayout, FlowLayout,
GridLayout.
Cada clase tiene sus propias reglas de acuerdo a
las cuales distribuye las componentes en el
contenedor.
Interfaces Grficas en Java
102
FlowLayout
Permite crear organizadores muy simples, las
componentes se distribuyen de izquierda a
derecha en el orden en el que se agregan.
eti1 = new JLabel (primero);
eti2 = new JLabel (segundo);
eti3 = new JLabel (tercero);
getContentPane().setLayout(new FlowLayout());
getContentPane().add(eti1);
getContentPane().add(eti2);
getContentPane().add(eti3);
getContentPane().add(new JLabel(cuarto));
Interfaces Grficas en Java
103
GridLayout
Las componentes se distribuyen en una grilla cuyo
nmero de filas y columnas se establece al
seleccionar la clase del organizador.
eti1 = new JLabel (primero);
eti2 = new JLabel (segundo);
eti3 = new JLabel (tercero);
eti4 = new JLabel (cuarto);
getContentPane().setLayout(new GridLayout(3,2));
getContentPane().add(eti1);
getContentPane().add(eti2);
getContentPane().add(eti3);
getContentPane().add(eti4);
Interfaces Grficas en Java
104
BorderLayout

BorderLayout.NORTH

BorderLayout BorderLayout
BorderLayout.CENTER
.WEST .EAST

BorderLayout.SOUTH

Al agregarse cada componente se establece


la regin.
Interfaces Grficas en Java
105
BorderLayout

eti1 = new JLabel (primero);


eti2 = new JLabel (segundo);
eti3 = new JLabel (tercero);
getContentPane().setLayout(new BorderLayout());
getContentPane().add(eti1,BorderLayout.NORTH);
getContentPane().add(eti2,BorderLayout.WEST);
getContentPane().add(eti3,BorderLayout.SOUTH);
106
The Java Tutorials

http://download.oracle.com/javase/tutorial/uiswin
g/layout/index.html
Programacin Basada en Eventos
La construccin de una GUI utiliza un modelo de
programacin basado en eventos.
En este modelo el orden en el cual se ejecutan las
instrucciones de un programa queda determinado
por eventos.
Un evento es una seal de que algo ha ocurrido.
En esta materia consideraremos nicamente eventos
generados por acciones del usuario al interactuar
con la GUI.
Programacin Basada en Eventos

Algunas componentes de una GUI son reactivas,


pueden percibir las acciones del usuario y
reaccionar en respuesta a ellas.
Una componente reactiva estn asociada a un objeto
fuente del evento creado por el programador.
La reaccin del sistema en respuesta a la accin del
usuario va a quedar determinada por la clase a la que
pertenece un objeto oyente.
El objeto oyente est ligado al objeto fuente de
evento a travs de una instruccin de registracin.
Programacin Basada en Eventos
Un objeto fuente de evento tienen la capacidad
de percibir un evento externo y disparar un
evento interno, esto es, crear un objeto evento de
software.
Este objeto evento de software es el argumento de
un mensaje enviado al objeto oyente.
El mtodo que se ejecuta en respuesta a este
mensaje forma parte de una interface provista por
Java y es implementado por el programador en la
clase del oyente.
Programacin Basada en Eventos
Desarrolle una aplicacin que permita establecer si color de
fondo de una ventana debe ser rojo o en verde de acuerdo al
botn que se apriete.
La ventana inicialmente debe aparecer as:

ste es el aspecto cuando se aprieta rojo o verde:


Programacin Basada en Eventos

ActionEvent e JButton botonRojo

dispara un detecta el
evento evento
OBJETO interno OBJETO externo
EVENTO FUENTE

Los dos
registrado botones son
componentes
reactivas

OBJETO
El objeto oyente
OYENTE
recibe un mensaje
con el objeto evento
como parmetro OyenteBotonR ponerR
Interfaces Grficas en Java
La construccin de una GUI va a requerir
Definir clases que deriven de las clases grficas
provistas por Java.
Definir clases que implementen interfaces
grficas provistas por Java.
Crear objetos de las clases que definimos
derivando las clases de los paquetes Swing o AWT
Crear objetos de las clases provistas por el
paquete Swing o AWT
Crear objetos de las clases que implementan
interfaces
Interfaces Grficas en Java
La construccin de una GUI va a requerir
Definir clases que deriven de las clases grficas
provistas por Java.
En el ejemplo vamos a definir una clase
GUIFondoRojoVerde que extiende a JFrame.
Como todo frame, un objeto de la clase
GUIFondoRojoVerde, tendr un borde, una barra de ttulo
con tres botones y un panel de contenido.
En el panel de contenido vamos a insertar dos botones
rotulados Rojo y Verde.
Interfaces Grficas en Java
La construccin de una GUI va a requerir
Definir clases que implementen interfaces grficas
provistas por Java.
En el ejemplo definimos dos clases: OyenteBotonR
y OyenteBotonV cada una implementa a la interface
ActionListener definiendo el mtodo
actionPerfomed.
Interfaces Grficas en Java
La construccin de una GUI va a requerir
Crear objetos de las clases que implementan
interfaces
En el ejemplo creamos dos objetos oyente uno de
clase OyenteBotonR y otro OyenteBotonV
Interfaces Grficas en Java
La construccin de una GUI va a requerir
Crear objetos de las clases provistas por el paquete
Swing o AWT
En el ejemplo creamos dos objetos fuentes de
evento botonRojo y botonVerde ambos de la clase
JButton
Interfaces Grficas en Java
La estructura de las GUI que hemos estamos
definiendo consta de:
Instrucciones para importar paquetes grficos.
La definicin de una clase que crea un frame de
una clase que extiende a JFrame y lo hace visible.
La definicin de la clase que extiende a JFrame e
incluye:
Atributos asociados a componentes de la GUI y
otros vinculados a la aplicacin
Un constructor
Clases que implementan interfaces y permiten
crear oyentes
Interfaces Grficas en Java
//importar paquetes
import java.awt.*;
import javax.swing.*;
...
public class GuiFondoRojoVerde extends JFrame {
//definir atributos asociados a las componentes
// de la GUI y de la aplicacin
private JButton botonRojo,botonVerde;

//definir el contructor de la clase que extiende a JFrame


public GuiFondoRojoVerde (){
//Crear los oyentes
OyenteBotonR ponerRojo = new OyenteBotonR();
OyenteBotonV ponerVerde = new OyenteBotonV();
...
}

//definir clases para los oyentes


class OyenteBotonR implements ActionListener {}
}
Interfaces Grficas en Java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class GuiFondoRojoVerde extends JFrame {
private JButton botonRojo, botonVerde;
public GuiFondoRojoVerde (){
...
hacerGUI();
}
private void hacerGUI(){
...
}
class OyenteBotonR implements ActionListener {}
class OyenteBotonV implements ActionListener {}
}

Modulamos el cdigo a travs de un mtodo interno.


Interfaces Grficas
Un constructor o el mtodo invocado desde el constructor,
incluye instrucciones para:
establecer los valores de los atributos heredados de la
clase JFrame
crear objetos ligados a componentes grficas
crear objetos oyente
registrar los oyentes a los objetos fuente de evento
establecer el diagramado de los contenedores
establecer los atributos de las componentes
insertar las componentes en los contenedores
Interfaces Grficas
public GuiFondoRojoVerde (){
//establecer atributos heredados de JFrame
setLayout(new FlowLayout());
setSize(200, 120);
setDefaultCloseOperation(EXIT_ON_CLOSE);
hacerGUI(); }
private void hacerGUI(){
//crear los objetos ligados a las componentes grficas
botonRojo = new JButton("Rojo");
botonVerde = new JButton("Verde");
//Crear los objetos oyentes
OyenteBotonR ponerRojo = new OyenteBotonR();
OyenteBotonV ponerVerde = new OyenteBotonV();
//Registrar los oyentes
botonRojo.addActionListener(ponerRojo);
botonVerde.addActionListener(ponerVerde);
//Insertar los componentes en el panel del frame
getContentPane().add(botonRojo);
getContentPane().add(botonVerde);
}
Interfaces Grficas
public GuiFondoRojoVerde (){
//establecer atributos heredados de JFrame
setLayout(new FlowLayout());
setSize(200, 120);
setDefaultCloseOperation(EXIT_ON_CLOSE);
hacerGUI(); }
private void hacerGUI(){
//boton rojo
botonRojo = new JButton("Rojo");
OyenteBotonR ponerRojo = new OyenteBotonR();
botonRojo.addActionListener(ponerRojo);
getContentPane().add(botonRojo);
//boton verde
botonVerde = new JButton("Verde");
OyenteBotonV ponerVerde = new OyenteBotonV();
botonVerde.addActionListener(ponerVerde);
getContentPane().add(botonVerde);
}
Interfaces Grficas
class OyenteBotonR implements ActionListener {

public void actionPerformed(ActionEvent event){


getContentPane().setBackground(Color.red); }
}

class OyenteBotonV implements ActionListener {

public void actionPerformed(ActionEvent event) {


getContentPane().setBackground(Color.green);
}
}
}

La clase de cada oyente es interna a la clase que


especializa a JFrame
Paneles

La ejecucin de una aplicacin con una interfaz


grfica de usuario convencional puede comenzar
creando un objeto de una clase que desciende
JFrame.
Un objeto que es instancia de JFrame tiene un
panel de contenido.
En el panel de contenido pueden agregarse otros
paneles, sobre los que a su vez se insertan otras
componentes (en particular otros paneles).
Paneles

El uso de varios paneles facilita la organizacin de


componentes utilizando distintos diagramados y
estilos.
Por ejemplo, un panel puede contener tres botones
distribuidos en forma vertical y otro panel puede
tener una etiqueta y dos botones debajo, uno al lado
del otro.
Cada panel tiene entonces un diagramado diferente.
Ambos paneles se agregan al panel de contenido,
que tendr su propio layout o diagramado.
Paneles

En el ejemplo de los botones rojo y verde, los dos


botones se agregaban directamente al panel de
contenido:

botonRojo = new JButton("Rojo");

getContentPane().add(botonRojo);

El mensaje getContentPane() es enviado al frame y


retorna un objeto de la clase Container
Como todo contenedor, el panel de contenido puede
recibir mensaje add.
Paneles

Una alternativa ms adecuada es organizar las


componentes de una GUI de manera jerrquica.
Esto es, el panel de contenido contiene dos paneles,
en uno se ubican los botones y en otro se establece
el color elegido.
El panel de contenido va a tener un organizador de
layout que determina como se distribuyen los dos
paneles.
El panle de botones tiene un organizador de layout
que determina como se ubican los dos botones.
Paneles
Desarrolle una aplicacin que permita establecer si color de
fondo de una ventana debe ser rojo o en verde de acuerdo al
botn del panel que se apriete.
La ventana inicialmente debe aparecer as:

ste es el aspecto cuando se aprieta rojo o verde:


Paneles
import
public class GUIColorFondoPaneles
extends JFrame {
private Container contenedor;
private JPanel panelColor, panelBotones;
private JButton botonRojo, botonVerde;

public GUIColorFondoPaneles(){
contenedor = getContentPane();
//layout del panel de contenido
contenedor.setLayout(new BorderLayout());
setSize(320,180);
setDefaultCloseOperation(EXIT_ON_CLOSE);
hacerGUI();

}
Se captura el panel de contenido del frame
}
Paneles
private void hacerGUI(){
//Se crean los paneles
panelColor = new JPanel();
panelBotones = new JPanel();
//Se crean los botones y los oyentes
botonRojo = new JButton("Rojo");
OyenteBotonR ponerRojo = new OyenteBotonR();
botonRojo.addActionListener(ponerRojo);
botonVerde = new JButton(Verde");
OyenteBotonV ponerVerde = new OyenteBotonV();
botonVerde.addActionListener(ponerVerde);
//Se agregan los botones al panel de botones
panelBotones.add(botonRojo);
panelBotones.add(botonVerde);
//Se agregan los paneles al panel de contenido
contenedor.add(panelColor,BorderLayout.NORTH);
contenedor.add(panelBotones,BorderLayout.SOUTH);
}
Paneles
private void hacerGUI(){
//Se crean los paneles y se establecen atributos
panelColor = new JPanel();
panelBotones = new JPanel();
panelColor.setBackground(Color.GRAY);
panelColor.setPreferredSize
(new java.awt.Dimension(300, 0));
panelBotones.setBackground(Color.WHITE);
panelBotones.setPreferredSize
(new java.awt.Dimension(300, 40));

Modificamos los atributos los dos paneles

Modificar el layout de panelBotones para que un botn


quede encima del otro.
Paneles


botonRojo = new JButton("Rojo");
OyenteBotonR ponerRojo = new OyenteBotonR();
botonRojo.addActionListener(ponerRojo);

private class OyenteBotonR implements


ActionListener {
public void actionPerformed(ActionEvent event){
panelColor.setBackground(Color.red);}
}
}
Campos de texto

Un campo de texto es una caja que permite ingresar


una lnea de texto por teclado.
Un objeto de la clase JTextField permite
mantener un campo de texto
Cada vez que el usuario tipea una tecla se disparan
uno o ms eventos de tecla, esto es, se crean objetos
de clase KeyEvent o de la clase ActionEvent.
Nos interesa capturar los eventos de clase
ActionEvent que se disparan cuando el usuario
oprime Enter despus de tipear una cadena.
Campos de texto

Implementar una GUI que permita ingresar el color con el que se


desea pintar el panel, en una caja de texto. El color debe
ingresarse con minscula. Si se ingresa rojo, verde o azul, el
panel se pinta del color respectivo; si no, se pinta del color de
fondo, que es gris claro.
Campos de texto

public class GUIColorFondoCajaTexto extends JFrame {

private Container contenedor;


private Color colorFondo;
private JPanel panelColor, panelTexto;
private JTextField cajaColor;

public GUIColorFondoCajaTexto (){


contenedor = getContentPane();
contenedor.setLayout(new GridLayout(2, 1));
setSize(300,180);
setDefaultCloseOperation(EXIT_ON_CLOSE);
hacerGUI();

Para
} ingresar texto usamos un objeto de la clase
JTextField.
Campos de texto
private void hacerGUI(){

colorFondo=new Color(200,200,200);

panelColor = new JPanel();


panelColor.setBackground(colorFondo);
panelColor.setPreferredSize
(new java.awt.Dimension(300,100));

panelTexto = new JPanel();


panelTexto.setBackground(Color.GRAY);
panelTexto.setPreferredSize
(new java.awt.Dimension(300, 50));

}
Campos de texto
private void hacerGUI(){

cajaColor = new JTextField(15);


OyenteCaja cColor = new OyenteCaja();
cajaColor.addActionListener(cColor);

panelTexto.add(cajaColor);
contenedor.add(panelTexto);
contenedor.add(panelColor);

}
Campos de texto
public class GUIColorFondoCajaTexto extends JFrame {

private class OyenteCaja implements


ActionListener {
public void actionPerformed(ActionEvent event){
String s = cajaColor.getText();
if (s.equals("rojo"))
panelColor.setBackground(Color.red);
else if (s.equals("verde"))
panelColor.setBackground(Color.green);
else if (s.equals("azul")
panelColor.setBackground(Color.blue);
else
panelColor.setBackground(colorFondo);
}
}
}
Cuadro de Dilogo
Un cuadro de dilogo es una ventana que en
general se usa para leer un valor simple y/o mostrar
un mensaje. Incluye adems uno o ms botones.
El mensaje puede ser un error o una advertencia y
puede estar acompaado de una imagen o algn
otro elemento.
Para definir un dilogo standard usamos la clase
JOptionPane.
Las clases Printing, JColorChooser y
JFileChooser permiten ofrecer dilogos ms
especficos.
Para crear un dilogo a medida se usa la clase
JDialog directamente.
Cuadro de Dilogo

Todo dilogo es dependiente de un frame.


Cuando un frame se destruye, tambin se
destruyen los dilogos que dependen de l.
Un dilogo es modal cuando bloquea la entrada de
datos del usuario a travs de todas las dems
ventanas.
Los cuadros de dilogo creados con
JOptionPane son modales.
Para crear un dilogo no modal usamos JDialog
directamente.
Caso de Estudio: Cuenta Bancaria

Se desea modelar una cuenta bancaria sobre la


que se realizan depsitos, extracciones y
consultas de saldo.
La cuenta bancaria tiene asociado un cdigo y un
saldo. El cdigo la identifica unvocamente y es
fijo. El saldo aumenta cuando el titular de la
cuenta efecta un depsito y disminuye cuando
realiza una extraccin.
El usuario est autorizado a girar en descubierto
hasta un monto mximo establecido.
Caso de Estudio: Cuenta Bancaria

El usuario opera con su cuenta bancaria a travs


de una interfaz grfica como la que sigue
Caso de Estudio: Cuenta Bancaria

Si el usuario presiona el botn Depositar en pantalla


aparece un cuadro de dilogo como el que sigue:

Si el usuario presiona el botn OK aparece en pantalla un


mensaje.
Caso de Estudio: Cuenta Bancaria

Anlogamente si el usuario presiona el botn Extraer en


pantalla aparece un cuadro de dilogo como el que
sigue:

Si el usuario presiona el botn OK aparece en pantalla un


mensaje
Caso de Estudio: Cuenta Bancaria

Si el usuario presiona el botn Consultar Saldos en


pantalla aparece un

O bien
Caso de Estudio: Cuenta Bancaria

class Cajero
public static void main(String[] args) {
GUI_CtaBancaria unaCuenta = new GUI_CtaBancaria();
unaCuenta.setVisible(true);
}
}
Caso de Estudio: Cuenta Bancaria
import
public class GUI_CtaBancaria extends JFrame {
private CuentaBancaria cuenta;
private Container contenedor;
private JPanel panelAcciones,panelConsulta;
private JButton botonConsultar,
botonExt, botonDep;

public GUI_CtaBancaria() {

}

}
Caso de Estudio: Cuenta Bancaria

Crear la Cuenta Bancaria


Capturar el panel de contenido

Crear el panel de acciones y de consulta

Crear cada uno de los botones y su oyente

Registrar cada oyente a su botn

Agregar los botones a los paneles correspondientes

Agregar los paneles al panel de contenido


Caso de Estudio: Cuenta Bancaria
public GUI_CtaBancaria() {
cuenta = new CuentaBancaria(3);
contenedor = getContentPane();
panelAcciones = new JPanel();
panelConsulta = new JPanel();
botonDep = new JButton();
botonExt = new JButton();
botonConsultar = new JButton();
setSize(210, 210);
setDefaultCloseOperation(EXIT_ON_CLOSE);
armarGUI();
}
Caso de Estudio: Cuenta Bancaria
public void armarGUI() {

OyenteDepositar oDepositar=new OyenteDepositar();


OyenteExtraer oExtraer = new OyenteExtraer();
OyenteConsultar oConsultar =new OyenteConsultar();

botonDep.setPreferredSize(new Dimension(124, 50));


botonDep.setSize(150, 50);
botonDep.setBorder(BorderFactory.createCompoundBorde(
new LineBorder
(new java.awt.Color(0, 0, 0), 1, false),null));
botonDep.addActionListener(oDepositar);

}
Caso de Estudio: Cuenta Bancaria
public void armarGUI() {

botonExt.setText("Extraer");
botonExt.setPreferredSize(new Dimension(124, 50));
botonExt.setSize(150, 50);
botonExt.setBorder(BorderFactory.createCompoundBorder(
new LineBorder(
new java.awt.Color(0, 0, 0), 1, false),null));
botonExt.addActionListener(oExtraer);

}
Caso de Estudio: Cuenta Bancaria
public void armarGUI() {

botonConsultar.setText("Consultar Saldo");
botonConsultar.setPreferredSize(new Dimension(136,
30));
botonConsultar.setSize(150, 30);
botonConsultar.setBorder
(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
botonConsultar.addActionListener(oConsultar);

}
Caso de Estudio: Cuenta Bancaria
public void armarGUI() {

// Layout del panel contenedor


contenedor.setLayout(new BorderLayout());

// Panel de Acciones
panelAcciones.setBorder(
BorderFactory.createEtchedBorder(BevelBorder.LOWERED));
panelAcciones.setPreferredSize(
new Dimension(160, 130));
panelAcciones.setSize(160, 125);

}
Caso de Estudio: Cuenta Bancaria
public void armarGUI() {

// Agregar botones a los paneles

panelAcciones.add(botonDep);
panelAcciones.add(botonExt);
panelConsulta.add(botonConsultar);

// Agregar los paneles al contenedor


contenedor.add(panelAcciones, BorderLayout.NORTH);
contenedor.add(panelConsulta, BorderLayout.SOUTH);
}
Caso de Estudio: Cuenta Bancaria

Agregar el oyente asociado al botn


Caso de Estudio: Cuenta Bancaria

Agregar el oyente asociado al botn


Caso de Estudio: Cuenta Bancaria

Agregar el oyente asociado al botn


Caso de Estudio: Cuenta Bancaria
private class OyenteDepositar implements ActionListener {
public void actionPerformed(ActionEvent event){
float dep;
String deposito;
JOptionPane dialogo = new JOptionPane();

deposito = dialogo.showInputDialog
( "Ingrese la cantidad a depositar" );
if ((deposito != null) && (deposito.length() > 0)){
dep = Float.parseFloat(deposito);
dialogo.showMessageDialog(null,
"Usted deposit " + dep+ " pesos","Depsito",
JOptionPane.PLAIN_MESSAGE );
cuenta.depositar(dep);
}
}
}
Caso de Estudio: Cuenta Bancaria
private class OyenteExtraer implements ActionListener {
public void actionPerformed(ActionEvent event){
float ext;
String extraccion;
JOptionPane dialogo = new JOptionPane();
extraccion = dialogo.showInputDialog
( "Ingrese la cantidad a extraer" );
Caso de Estudio: Cuenta Bancaria
private class OyenteExtraer implements ActionListener {
public void actionPerformed(ActionEvent event){
float ext;
String extraccion;

if ((extraccion != null) && (extraccion.length() > 0)){


ext = Float.parseFloat(extraccion);
if (cuenta.puedeExtraer(ext)){
JOptionPane.showMessageDialog( null,
"Usted extrajo "+ext+ " pesos",
"Extraccin", JOptionPane.PLAIN_MESSAGE );
cuenta.extraer(ext) ;}
else
dialogo.showMessageDialog( null,
"Usted NO puede extraer esa cantidad,
"Advertencia", JOptionPane.WARNING_MESSAGE );
}}}
Caso de Estudio: Cuenta Bancaria
private class OyenteConsultar implements ActionListener {
public void actionPerformed(ActionEvent event){
JOptionPane dialogo = new JOptionPane();

if (cuenta.obtenerSaldo()>=0)
dialogo.showMessageDialog(null,
"Usted tiene un saldo de " + cuenta.obtenerSaldo()+
" pesos,"SALDO,JOptionPane.INFORMATION_MESSAGE );
else
dialogo.showMessageDialog(null,
"Usted est en rojo en " +
(-1)*cuenta.obtenerSaldo() + " pesos,
"SALDO", JOptionPane.ERROR_MESSAGE );
}
}
GUI y Encapsulamiento

Conectamos la clase CuentaBancaria a una GUI sin


modificar el cdigo que est completamente
encapsulado.
La clase CuentaBancaria es proveedora de
servicios
La clase GUICuentaBancaria usa CuentaBancaria
como una caja negra, conoce nicamente la
interface y el contrato.
Podemos modificar la GUI sin cambiar la clase
asociada y viceversa.
JComponent

Paneles JPanel
Etiquetas JLabel
Textos JTextField JTextArea
Botones JButton, JRadioButton
Combo box JComboBox
Dilogos JOptionPane
Interfaces Grficas en Java
La jerarqua de clases grficas

JFrame

JComponent
Interfaces Grficas en Java
La jerarqua de clases del paquete Swing

JButton

JLabel

JTextField

JLabel JComboBox JPanel JOptionPane


Paneles

Un panel es un rea sobre la que trabaja el usuario


o se colocan otras componentes.
Nosotros solo usaremos paneles como
contenedores de otros paneles u otro tipo de
componentes.
Para definir un panel creamos un objeto de la clase
JPanel.
El principal atributo de un panel es el diagramado o
layout que permite especificar como se organizan
las dems componentes.
Paneles

Los paneles van a quedar organizados de manera


jerrquica.
Esto es, el panel de contenido contiene paneles que
a su vez pueden contener a otros paneles.
El panel de contenido va a tener su organizador de
layout y para cada uno de los paneles en que se
divide podemos establecer tambin un organizador
de layout.
Etiquetas

Una etiqueta es una componente grfica que


permite mostrar una imagen o un texto esttico.
Para definir una etiqueta creamos un objeto de la
clase JLabel.
Una etiqueta tiene un tamao, un cono y un texto.
JLabel(String s)
JLabel(String s, int alineacion)
JLabel(Icon i)
JLabel(Icon i, int alineacion)
JLabel(String s, Icon i)
JLabel(String s, Icon i, int alineacion)
JLabel()
Campos de Texto
Un campo de texto es una caja que permite
ingresar una lnea de texto por teclado.
Para definir un campo de texto creamos un objeto
de la clase JTextField
Los atributos son la cadena, la cantidad de
caracteres y el modelo a utilizar.
Los constructores son:

JTextField()
JTextField(Document doc, String text, int col)
JTextField(int col)
JTextField(String text)
JTextField(String text, int col)
Dilogos
Un dilogo es una ventana que mantiene
informacin temporaria .
En general incluye un mensaje de error o de
advertencia, pero tambin puede incluir una
imagen o un rbol de directorio. Tambin incluye
uno o ms botones.
Usaremos la clase JOptionPane para crear
cuadros de dilogo simples.
Un dilogo de la clase JOptionPanel se dice
modal.
Un dilogo modal es visible, bloquea las entradas
del usuario en todas las otras ventanas del
programa.
Dilogos
Los atributos de un objeto de clase JOptionPane son:
cono, texto del ttulo, texto del mensaje y texto del
botn
Podemos utilizar un icono personalizado, no utilizar
ninguno, o utilizar uno de los cuatro iconos standard
de JOptionPane (question, information, warning, y
error).
Los servicios provistos por JOptionPane son:
showMessageDialog
showConfirmDialog
showOptionDialog
showInputDialog
Dilogos
showMessageDialog
Muestra un dilogo modal con un botn, etiquetado "OK". Se
puede especificar el icono y el texto del mensaje y del ttulo. Por
omisin el cono es de informacin
showConfirmDialog
Muestra un dilogo modal con dos botones, etiquetados "Yes" y
"No". Por omisin aparece el cono question.
showOptionDialog
Debemos especificar el texto de los botones.
showInputDialog
Muestra un dilogo modal que obtiene una cadena del usuario.
La cadena puede ser ingresada por el usuario en un cuadro de
texto o elegida de un ComboBox no editable.
Por omisin aparece el cono question.
Radio Button
Un radio button permite que el usuario seleccione
una entre varias opciones alternativas de un grupo
de botones.
Para usar un grupo de botones creamos un objeto
de la clase JRadioButton.
La definicin de un grupo asegura que slo una de
las alternativas est seleccionada.
Radio Button
Los constructores de un objeto de clase JLabel
son:

JRadioButton(String s)
JRadioButton(String s, boolean b)
JRadioButton(Icon i)
JRadioButton(Icon i, boolean b)
JRadioButton(String s, Icon i)
JRadioButton(String s, Icon i, boolean b)
JRadioButton()
Combo box

Un combo box permite que el usuario seleccione


una entre varias opciones alternativas.
Para usar un combo box creamos un objeto de la
clase JComboBox.
Combo box

El combo box puede ser no editable o editable. Un


combo box no editable consta de una lista de
valores drop-down y un botn.
Un combo box editable tiene adems un campo de
texto con un pequeo botn.
El usuario puede elegir una opcin de la lista o
tipear un valor en el campo de texto.
Los combo box se usan como alternativa a los radio
buttons y las listas.
Combo box

Combo box
Combo box no
editable antes y
editable antes y
despus de hacer
despus de hacer
click sobre el
click sobre el botn.
botn.
Objetos y Eventos

Cada componente de una GUI est asociada a un


objeto grfico de alguna subclase de Component
Los objetos grficos reactivos son objetos fuente
de evento.
Cuando un objeto fuente de evento dispara un
evento interno, crea objetos evento de alguna
subclase de EventObject provista en el
paquete java.awt.event.
La creacin es implcita.
Objetos y Eventos
La clase de un objeto fuente de evento determina
las clases de los objeto evento que se crearn
implcitamente:
Clase de los objetos Clases de los objetos
Fuente de evento evento
JButton ActionEvent

JTextField ActionEvent, KeyEvent

JComboBox ActionEvent, ItemEvent

JLabel ActionEvent, ItemEvent

JMenuItem ActionEvent

JCheckBox ActionEvent, ItemEvent

Component ComponentEvent,
MouseEvent, KeyEvent,
Objetos y Eventos
El usuario realiza una accin sobre una
componente reactiva que genera un evento
externo

Evento Evento
Externo Interno
percibe dispara

OBJETO OBJETO
FUENTE EVENTO
Component crea EventObject

El objeto fuente de evento asociado a la


componente reactiva
dispara un evento interno
creando objetos de alguna subclase de
EventObject
Objetos y Eventos
Los objetos de las clases JButton, JTextField,
JComboBox son objetos fuente de eventos que crean
objetos evento de clase ActionEvent.
Esto es, cuando el usuario realiza una accin sobre la
componente asociada al objeto fuente de evento, este
crea un objeto de clase ActionEvent
La clase del objeto oyente que escuche estos eventos
deben implementar la interface ActionListener del
paquete java.awt.event.
Objetos y Eventos

Implementar una interface implica definir un


mtodo manejador del evento de acuerdo al
comportamiento esperado en respuesta a la
accin del usuario.
Cualquier objeto de alguna subclase de las
mencionadas crear tambin objetos evento de
clase ActionEvent.
Observemos que los objetos de algunas clases
crearn eventos de la clase ItemEvent.
Objetos y Eventos

Cada subclase de EventObject define atributos y


mtodos adecuados para un tipo particular de accin
del usuario, como por ejemplo, mover el mouse sobre un
panel, oprimir una tecla o activar un botn.
En cada uno de estos casos se crear un objeto evento
de una clase especfica.
Objetos y Eventos
El objeto oyente es instancia de una
clase que implementa una interface y
redefine el mtodo responsable de
reaccionar ante la accin del usuario

Evento Evento
Externo Interno
percibe dispara

OBJETO OBJETO OBJETO


FUENTE EVENTO Oyente
Component crea EventObject ActionListener

registrado a
El objeto evento es un parmetro
para el mtodo manejador del evento
Objetos y Eventos

La clase a la que pertenece el objeto fuente de


evento contiene el cdigo que:
percibe el evento externo
dispara el evento interno
invoca al manejador de evento definido en la
clase del oyente.
Objetos y Eventos

La interface define uno o ms mtodos manejadores que


deben ser implementados considerando el
comportamiento esperado en respuesta a la accin del
usuario.
La lista de parmetros de un manejador de eventos
siempre consiste en un argumento del tipo de clase
evento.
Objetos y Eventos

Objeto Evento Interface de oyente Manejador


ActionEvent ActionListener actionPerformed(ActionEvent)
ItemEvent ItemListener itemStateChanged(ItemEvent)
MouseEvent MouseListener mousePressed(MouseEvent)
mouseReleased(MouseEvent)
mouseEntered(MouseEvent)
mouseExited(MouseEvent)
mouseClicked(MouseEvent)
KeyEvent KeyListener keyPressed(KeyEvent)
keyRealesed(KeyEvent)
keyTyped(KeyEvent)
GUI Polimorfismo y Ligadura Dinmica

JButton OyenteBotonRojo

botonRojo.addActionListener(ponerRojo);

cajaColor.addActionListener(cColor);

JTextField OyenteCaja

En qu clase se define addActionListener?

De qu clase debera ser el parmetro?


Maquina Expendedora

Una fbrica produce dos tipos diferentes de mquinas


expendedoras de infusiones, M111 y R101.
Las mquinas del tipo M111 preparan caf, caf con
leche, t, t con leche y submarino. Tienen depsitos
para los siguientes ingredientes: caf, t, leche y cacao.
Las mquinas de tipo R101 preparan caf, t y caf
carioca . Tienen depsitos para caf, t, crema y cacao.

Maquina Expendedora

Los depsitos tienen las siguientes capacidades


mximas:
Caf 1500
T 1000
Leche 600
Cacao 600
Crema 600
Adems de la capacidad mxima de cada ingrediente,
cada mquina mantiene registro de la cantidad
disponible.
Maquina Expendedora

Cuando se habilita una mquina las cantidades


disponibles comienzan con el valor mximo de cada
ingrediente.
La cantidad disponible aumenta cuando se carga el
depsito con un ingrediente especfico y disminuye cada
vez que se prepara una infusin.
El aumento es variable, aunque nunca se puede superar
la capacidad mxima de cada ingrediente.
Si el valor que se intenta cargar, sumado al disponible,
supera al mximo, se completa hasta el mximo y
retorna el sobrante.
Maquina Expendedora

Cada vez que se solicita una infusin se reducen los


ingredientes de acuerdo a la siguiente tabla:

Caf Caf con Submarino T con caf carioca


leche leche
Caf 40 30 30
Leche 20 50 20
T 20
Cacao 40 10
Crema 30

En el caso de la preparacin de una taza de t, la mquina


M111 utiliza 10 grs y la mquina R101 15 grs.
Maquina Expendedora
MaquinaExpendedora
<<atributos de instancia>>
caf
t
cacao
<<comandos>>
cafe()
<<consultas>>
obtenerCafe() : entero

M111 R101

<<atributos de instancia>> <<atributos de instancia>>


leche crema
<<comandos>> <<comandos>>
teConLeche() carioca ()
submarino() <<consultas>>
<<consultas>> obtenerCrema(): entero
obtenerLeche() : entero
Maquina Expendedora

Comenzaremos implementando parcialmente una GUI para


una mquina expendedora del modelo R101

Inialmente est activo el botn para


preparar caf y uno para el
Empleado que permite cargar
ingredientes
Maquina Expendedora

Si se oprime el botn Caf aparece un cartel informativo y


el nico botn activo es el que debe seleccionarse al retirar
el vaso
Maquina Expendedora

Si la cantidad de ingredientes no es suficiente se muestra


un cartel y se activa el botn que permite volver al estado
inicial.
Maquina Expendedora

Si se elige el botn Empleado se cargan todos los


ingredientes hasta llegar al mximo y aparece un cartel
informativo:

Al oprimir Aceptar vuelve a aparecer la pantalla inicial.


Maquina Expendedora

panelBotones

panelES
panelRetirar
panelEmpleado
Maquina Expendedora

botonCafe

botonRetirarInfusion
botonEmpleado
Maquina Expendedora

cartelSalida cartelBebida
Maquina Expendedora

public class GUI_R101 extends JFrame {

private R101 unaMaquina;


private Container contenedor;
private JPanel panelBotones, panelES,
panelRetirar, panelEmpleado;
private JLabel cartelSalida,cartelBebida;
private JButton botonCafe,
botonRetirarInfusion,
botonEmpleado;

}
Maquina Expendedora

Un constructor incluye instrucciones para:


capturar el panel de contenido
crear paneles, etiquetas y botones
crear objetos oyente para los botones
establecer el diagramado y atributos de los
paneles
establecer los atributos de etiquetas y botones
insertar botones y etiquetas en los paneles y los
paneles en el panel de contenido
Maquina Expendedora
public GUI_R101() {
unaMaquina = new R101();

contenedor = getContentPane();
botonCafe = new JButton() ;
botonRetirarInfusion = new JButton() ;
botonEmpleado = new JButton() ;
cartelSalida = new JLabel();
cartelBebida = new Jlabel();
panelBotones = new JPanel();
panelES = new JPanel() ;
panelRetirar = new JPanel() ;
panelEmpleado = new JPanel() ;
initGUI();
}

Maquina Expendedora
private void initGUI() {

BoxLayout esteLayout = new


BoxLayout(contenedor,BoxLayout.Y_AXIS) ;
contenedor.setLayout(esteLayout);

OyenteCafe oCafe = new OyenteCafe();


botonCafe.setText("Caf");
botonCafe.setFont(new Font("Arial",1,22));
botonCafe.addActionListener(oCafe);

}
Maquina Expendedora
private void initGUI() {

OyenteRetirar oRetirar = new OyenteRetirar();

botonRetirarInfusion.setText
("Apriete aqu para retirar su infusin o pedir otra");
botonRetirarInfusion.setEnabled(false);
botonRetirarInfusion.setFont(new
Font("SansSerif",1,14));
botonRetirarInfusion.setBorder
(BorderFactory.createEtchedBorder(BevelBorder.LOWERED));
botonRetirarInfusion.setPreferredSize
(new Dimension(360, 32));
botonRetirarInfusion.addActionListener(oRetirar);

}
Maquina Expendedora
private void initGUI() {

OyenteEmpleado oEmpleado = new OyenteEmpleado();

botonEmpleado.setText("Empleado");
botonEmpleado.setPreferredSize(new Dimension(306, 55));
botonEmpleado.setFont(new Font("Times New Roman",0,18));

botonEmpleado.addActionListener(oEmpleado);

}
Maquina Expendedora
private void initGUI() {

GridLayout panelBotonesLayout = new GridLayout(4, 1) ;

panelBotonesLayout.setHgap(5);
panelBotonesLayout.setVgap(5);
panelBotones.setLayout(panelBotonesLayout);
panelBotones.setPreferredSize(new Dimension(392, 369));
panelBotones.setSize(369, 250);
panelBotones.setBackground(new Color(235,235,235));

}
Maquina Expendedora
private void initGUI() {

panelES.setPreferredSize(new Dimension(392, 101));


panelES.setSize(369, 51);
panelES.setBorder
(BorderFactory.createBevelBorder(BevelBorder.LOWERED));

}
Maquina Expendedora
private void initGUI() {

cartelSalida.setLayout(new FlowLayout());
cartelSalida.setBorder (new LineBorder
(new Color(0,0,0), 1, false));
cartelSalida.setPreferredSize(new Dimension(277, 45));
cartelSalida.setHorizontalAlignment
(SwingConstants.CENTER);
cartelSalida.setHorizontalTextPosition
(SwingConstants.LEFT);
cartelSalida.setFont(new Font("Arial",0,14));

cartelBebida.setText("");
cartelBebida.setHorizontalAlignment
(SwingConstants.CENTER);
cartelBebida.setPreferredSize(new Dimension(88, 88));
}
Maquina Expendedora
private void initGUI() {

panelRetirar.setPreferredSize(new Dimension(392, 50));

}
Maquina Expendedora
private void initGUI() {

panelEmpleado.setPreferredSize(new Dimension(392, 64));


panelEmpleado.setBackground(new Color(235,235,235));

}
Maquina Expendedora
private void initGUI() {

panelBotones.add(botonCafe);
contenedor.add(panelBotones);

panelES.add(cartelSalida);
panelES.add(cartelBebida);
contenedor.add(panelES);

panelRetirar.add(botonRetirarInfusion);
contenedor.add(panelRetirar);

panelEmpleado.add(botonEmpleado);
contenedor.add(panelEmpleado);
}
Maquina Expendedora
public class GUI_R101 extends JFrame {
public GUI_R101() {

}
private void initGUI() {

}
private void deshabilitarBotones(){
botonCafe.setEnabled(false);
botonRetirarInfusion.setEnabled(true);;
botonEmpleado.setEnabled(false);
}

private void habilitarBotones(){


botonCafe.setEnabled(true);
botonRetirarInfusion.setEnabled(false);;
botonEmpleado.setEnabled(true);
}
}
Maquina Expendedora
public class GUI_R101 extends JFrame {

class OyenteCafe implements ActionListener{

public void actionPerformed(ActionEvent evt) {

int cantVasos = unaMaquina.vasosCafe();


if (cantVasos>=1){
unaMaquina.cafe();
cartelSalida.setText("Aqu tiene su caf");
cartelBebida.setText("CAF"); }
else {
cartelSalida.setText("No puede preparar caf");
cartelBebida.setText(""); }
deshabilitarBotones();
}
}

}
Maquina Expendedora
public class GUI_R101 extends JFrame {

class OyenteRetirar implements ActionListener{

public void
actionPerformed(ActionEvent evt) {

cartelSalida.setText("");
cartelBebida.setText("");
habilitarBotones();
}

}
Maquina Expendedora
public class GUI_R101 extends JFrame {

class OyenteEmpleado implements ActionListener{

public void actionPerformed(ActionEvent evt) {

int cafeCargado;
JOptionPane dialogo = new JOptionPane();
cafeCargado = unaMaquina.obtenerMaxCafe()-
unaMaquina.cargarCafe(unaMaquina.obtenerMaxCafe());

dialogo.showMessageDialog(null,"Se carg "+


cafeCargado+ " grs de caf, ,"Maquina cargada ,
JOptionPane.INFORMATION_MESSAGE); }
}

}
Maquina Expendedora

Complete la implementacin con los botones que faltan

botonCafe

botonTe

botonCafeCarioca
Maquina Expendedora

Implemente una GUI para la mquina R101 Plus

botonCafe

botonTe

botonCafeCarioca

botonBahiano
Maquina Expendedora

botonCafe

panelBotones

cartelSalida

panelES cartelBebida
panelRetirar botonRetirarInfusion
panelEmpleado botonCafeEmpleado

La GUI incluye diferentes tipos de componentes pero en este


caso slo los botones son reactivos.
Maquina Expendedora

public class GUI_R101 extends JFrame {


private R101 unaMaquina;

private Container contenedor;


private JPanel panelBotones, panelES,
panelRetirar, panelEmpleado;
private JLabel cartelSalida,cartelBebida;
private JButton botonCafe,

botonRetirarInfusion,botonEmpleado;

}
Componentes - Canvas
La clase Canvas permite representar elementos
grficos en pantalla.
A travs de su mtodo paint(Graphics g) se realizan
todos los dibujos sobre el canvas.
Es la ocurrencia de la clase Graphics la que permite
realmente pintar elementos grficos, el canvas es el
soporte.
Graphics2D hereda de Graphics, aportando una
mayor funcionalidad. A travs de un downcasting se
puede utilizar este objeto ms refinado.

Graphics2D g2d = (Graphics2D) g;


Componentes - Canvas
Clase Graphics
Mtodos:
drawString(String, int, int)
drawOval(int, int, int, int)
drawRect(int, int, int, int)
drawArc(int, int, int, int, int, int)
drawImage(Image, int, int, ImageObserver)
drawLine(int, int, int, int)
drawPolygon(int[], int[], int)
setColor(Color)
setFont(Font)
Componentes - Canvas
Crear un rea de dibujo:
class MiCanvas extends Canvas implements MouseListener
{
int x=50;int y=50;int radioX=30;int radioY=30;
MiCanvas()
{
this.setBackground(Color.white);
this.addMouseListener(this);
this.setFont(new Font("Courier", Font.BOLD, 24));
this.setCursor(new Cursor(Cursor.CROSSHAIR_CURSOR));
}
public void paint(Graphics g)
{
g.setColor(Color.red);
g.drawString("Dibuja Circunferencias",50,20);
g.setColor(Color.blue);
g.drawLine(50,40,340,40);
g.setColor(Color.green);
g.drawOval(x,y,radioX, radioY);
}
Componentes Canvas (continuacin)
public void mousePressed(MouseEvent e)
{
x=e.getX();
y=e.getY();
}

public void mouseReleased(MouseEvent e)


{
radioX=(e.getX()-x);
radioY=(e.getY()-y);
this.repaint();
}

public void mouseEntered(MouseEvent e) {}

public void mouseExited(MouseEvent e) {}

public void mouseClicked(MouseEvent e) {}


}

Posteriormente se podr aadir una ocurrencia de la clase


MiCanvas a cualquier Frame como un componente ms
Eventos java.awt.event
Este paquete proporciona las clases e interfaces
necesarias para gestionar los diferentes tipos de eventos
de los componentes de AWT.
Los eventos ms importantes que una aplicacin grfica
puede registrar son:
Ratn
Ratn (Drag & Drop)
Accin
Teclado
Ventana
Un evento del tipo accin se produce cuando se acciona algn
control
Eventos java.awt.event
Para que los componentes puedan recibir eventos deben registrarse
previamente indicando qu clase va a
gestionarlos.
Esta tarea se realiza a travs de la invocacin del mtodo
addInterfaz(clase a gestionar el evento).
Estas clases deben implementar los interfaces que se correspondan con
cada tipo de evento e indicar las acciones a ejecutar en el caso que se
active el evento.
Los interfaces ms utilizados son los siguientes:
EventListener
MouseListener
MouseMotionListener
ActionListener
KeyLIstener
WindowListener
Componentes y sus Listeners
Eventos java.awt.event
Estas interfaces definen una serie de mtodos que se corresponden con
las diferentes acciones asociadas a un tipo de evento determinado.
Por ejemplo, en un evento de teclado, el usuario puede presionar o
soltar una tecla.
Por lo tanto, cuando definamos la clase implementando la interfaz
correspondiente, se tendrn que implementar todos los mtodos
definidos en l.
Existen tres posibilidades para definir una clase que gestione los
eventos de un componente:
Crear una nueva clase.
Utilizar la clase que define la ventana, como clase que adems
gestionar los eventos.
Definir una clase annima dentro de la clase de ventana
Eventos java.awt.event
Eventos java.awt.event
Si se desea obtener informacin del evento producido, se puede hacer
a travs del argumento de cada mtodo invocado.
Por ejemplo, si se desea saber la tecla que se ha pulsado sobre una
caja de texto, deberemos operar de la siguiente manera:
Aplicar un listener que gestione los eventos de tipo teclado sobre la
caja de texto: cajaTexto.addKeyListener(new A());
Implementar el interface KeyListener con todos sus mtodos.
Identificar el mtodo asociado al evento pulsar una tecla.
Trabajar con el objeto que recibe el mtodo en el argumento, ya que es
ste quin posee toda la informacin del evento producido
Jerarqua de Interfaces de Eventos
Jerarqua de Interfaces de Eventos
Clases que implementan los interfaces:
java.awt.event.KeyAdapter (implements KeyListener)
java.awt.event.MouseAdapter (implements MouseListener)
java.awt.event.MouseMotionAdapter (implements
MouseMotionListener)
java.awt.event.WindowAdapter (implements WindowListener)
La ventaja que nos proporcionan las clases del tipo
Adapter es que realizan la implementacin de todos los
mtodos de la interface. De esta manera, se puede
heredar de ella, y slo se redefinir el mtodo necesario.
Eventos de Ventana

Definidos en el interface WindowListener:


Mtodos:
public void windowClosed(WindowEvent event)
public void windowDeiconified(WindowEvent event)
public void windowIconified(WindowEvent event)
public void windowActivated(WindowEvent event)
public void windowDeactivated(WindowEvent event)
public void windowOpened(WindowEvent event)
public void windowClosing(WindowEvent event)
Ejemplo eventos de ventana (I)
Ejemplo de implementacin del interface.
class Ventana extends Frame implements WindowListener
{
Ventana()
{ ;
this.addWindowListener(this);
}
//Hay que implementar todos los mtodos
public void windowClosed(WindowEvent event) { }
public void windowDeiconified(WindowEvent event) { }
public void windowIconified(WindowEvent event) { }
public void windowActivated(WindowEvent event) { }
public void windowDeactivated(WindowEvent event) { }
public void windowOpened(WindowEvent event) { }
public void windowClosing(WindowEvent event)
{System.exit(0);}
}
Ejemplo eventos de ventana (II)
Ejemplo sin implementacin del interface, a travs de la utilizacin de una clase
annima interna.
Implementacin del interfaz a travs de WindowAdapter.
nicamente se implementa el mtodo deseado.
De esta manera, no es nuestra clase la que gestiona el evento, sino la clase
annima creada de dentro de ella.
class Ventana extends Frame
{
Ventana()
{
this.addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{ System.exit(0); }
};
}
}
Eventos de Teclado

Implementar el interface KeyListener:


Mtodos:
public
void keyTyped(KeyEvent e)
public void keyPressed(KeyEvent e)
public void keyReleased(KeyEvent e)
Eventos de Teclado Ejemplo
Ejemplo de implementacin del interface.
public class ClienteWindow extends Applet implements
KeyListener
{

textoMensaje.addKeyListener(this);

public void keyTyped(KeyEvent e) {}
public void keyReleased(KeyEvent e) {}
public void keyPressed(KeyEvent e)
{
int code = e.getKeyCode();
if(KeyEvent.VK_ENTER == code)
{

}
}
}
Eventos sobre Components

Implementar el interface ActionListener:


Mtodos:
public void actionPerformed(ActionEvent
e)
Ejemplo de Eventos sobre componentes (I)

Ejemplo de implementacin del interface.


public class ClienteWindow extends Applet implements
ActionListener {

boton.addActionListener(this);

public void actionPerformed(ActionEvent event)
{
Object source = event.getSource();
if (source == boton)
{

}
}
Ejemplo de Eventos sobre componentes (II)

Ejemplo sin implementacin del interface, a travs de


la utilizacin de una clase annima.
boton.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{

}
};
Eventos de Ratn

Implementar el interface MouseListener:


Mtodos:
public void mouseClicked(MouseEvent e)
public void mouseEntered(MouseEvent e)
public void mouseExited(MouseEvent e)
public void mousePressed(MouseEvent e)
public void mouseReleased(MouseEvent e
COMO CREAR USANDO
SWING
JLabel

Crear una etiqueta:

JLabel etiq=new JLabel("Nombre: ");


/* En la siguiente sentencia se asigna un color a la
etiqueta utilizando el constructor Color(R,G,B) */
etiq.setForeground(new Color(255,0,0)); //Rojo
etiq.setFont(new Font("Times New Roman",Font.BOLD,
12));
JButton
Crear un botn:

JButton botonSalir = new JButton("Aceptar");

Gestin de eventos:
botonSalir.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
dispose();
System.exit(0);
}
});
JText

Crear una caja de texto:


JTextField textNombre = new JTextField(10);

Gestin de eventos:
textNombre.addKeyListener(new KeyAdapter()
{
public void keyTyped(KeyEvent e)
{
if ((int)e.getKeyChar()== KeyEvent.VK_ENTER)
System.out.println(textNombre.getText());
}
});
JComboBox
Crear una lista combinada:
String datos[] = { Uno, Dos, Tres, Cuatro,
Cinco};
JComboBox lista = new JComboBox (datos);
lista.setBorder(BorderFactory.createLineBorder(Color
.red,
4));

Gestin de eventos:
lista.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
System.out.println(lista.getSelectedItem());
}
});
JCheckBox
Crear una casilla de verificacin:
JCheckBox ch=new JCheckBox("Estudiante", new
ImageIcon("images/off.gif"), false);
ch.setRolloverSelectedIcon(new
ImageIcon("images/over.gif"));
ch.setRolloverIcon(new ImageIcon("images/over.gif"));
ch.setSelectedIcon(new ImageIcon("images/on.gif"));

Gestin de eventos:
ch.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
if(ch.isSelected())
mostrarMensaje("Check Activado");
}
});
JRadioButton
Crear una botn de opcin:
ButtonGroup grupo = new ButtonGroup();
rb1 = new JRadioButton("Hombre");
rb2 = new JRadioButton("Mujer");
rb1.setSelected(true);
rb1.setMnemonic(KeyEvent.VK_H);
rb2.setMnemonic(KeyEvent.VK_M);
grupo.add(rb1);
grupo.add(rb2);
Gestin de eventos:
rb1.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
if(rb1.isSelected())
mostrarMensaje("Radio Hombre
Activado");
}
});
JOptionPane
Esta clase se utiliza para crear cualquier tipo de dialogo estndar
para mostrar o recoger informacin.
Relacin (Tipo de dilogo Mtodo esttico):
Dilogo de Confirmacin (Si/No/Cancelar) showConfirmDialog
Dilogo de Entrada - showInputDialog
Dilogo de Mensaje - showMessageDialog
Dialogo Personalizable - showOptionDialog

Ejemplo:
String nombre = JOptionPane.showInputDialog(this,
"<html>Introduzca su <u>nombre</u>, por favor:</html>");
JOptionPane.showMessageDialog(this, "<html><H3>Proceso
finalizado satisfactoriamente</H3></html>");
JFileChooser

Permite mostrar los dilogos de Abrir y Guardar


como...
Relacin (Tipo de dilogo Mtodo instancia):
Dilogo de Abrir showOpenDialog
Dilogo de Guardar como... showSaveDialog

Ejemplo:
JFileChooser j = new JFileChooser();
int rtn = j.showOpenDialog(this);
if (rtn == JFileChooser.APPROVE_OPTION)
System.out.println(j.getSelectedFile().getPath());
Look & Feel
Modifica la apariencia de nuestra ventana.
Tipos:

Ejemplo:
int i=1; //Apariencia Motif
UIManager.LookAndFeelInfo looks[];
looks = UIManager.getInstalledLookAndFeels();
try
{
UIManager.setLookAndFeel(looks[i].getClassName());
SwingUtilities.updateComponentTreeUI(this);
}
catch(Exception e) {}
Metal (0) Motif (1) Windows (2) Windows Classic (3)
Look & Feel
Tambin es posible pasar como parmetro el nombre de la clase del Look &
Feel:
Metal javax.swing.plaf.metal.MetalLookAndFeel
Motif com.sun.java.swing.plaf.motif.MotifLookAndFeel
Windows com.sun.java.swing.plaf.windows.WindowsLookAndFeel
Windows Classic
com.sun.java.swing.plaf.windows.WindowsClassicLookAndFeel

Ejemplo:
try
{
UIManager.setLookAndFeel
(com.sun.java.swing.plaf.windows.WindowsLookAndFeel);
SwingUtilities.updateComponentTreeUI(this);
}catch(Exception e) {}
Mens

Cada ventana puede tener su propia barra de mens.


AWT ofrece:
JMenuBar: para crear la barra de mens

JMenu: para los diferente mens de la barra

Elementos del men:


instancias de la clase JMenuItem para elementos normales.
instancias de la clase JCheckBoxMenuItem.
otros mens.
separadores, gracias al mtodo addSeparator().

Potrebbero piacerti anche