Está en la página 1de 14

1.

Índice

• Introducción
– Objetivos
Contrucción de interfaces – Jerarquia de clases: patrón de diseño COMPOSITE

gráficas en Java
• Componentes principales
– Contenedores AWT/Swing
– Componentes AWT/Swing
AWT y Swing – Gestores de diseño
• Gestión de eventos
– Clases Listener
– Clases Adapter
• Patrón de diseño MVC

8. Contrucción de interfaces gráficos en Java 2

Introducción Objetivos

• Cualquier lenguaje de programación moderno ofrece • Entender el diseño de la jerarquía de clases


herramientas para la contrucción de interfaces Java que se utilizan para la construcción
gráficas de usuario (GUI). de GUIs.
Evento

• Java permite al programador: • Entender cómo se realiza la gestión de eventos.


– El diseño y programación de interfaces gráficas de usuario de
forma rápida y sencilla. • Aprender a usar un entorno de programación
– El paquete de clases AWT (Abstract Window Toolkit)‫‏‬ (Eclipse, Jbuilder, Jdeveloper...) para construir GUIs
– El paquete de clases Swing
• Swing es una evolución de AWT, ofreciendo más clases y una mayor
flexibilidad. • No es un objetivo:
- conocer todos los nombres de clases, interfaces y
demás componentes gráficos
8. Contrucción de interfaces gráficos en Java 3 8. Contrucción de interfaces gráficos en Java 4
Jerarquía de clases AWT :
AWT: componentes principales
patrón de diseño COMPOSITE

• Jerarquía de clases AWT Las opciones son infinitas:


- Una ventana con 2 campos de
texto, 3 botones y 2 áreas de
COMPONENTE texto, además de un panel que
contiene 5 casillas de verificación
y una lista desplegable.
- Una ventana con 2 etiquetas, 2
áreas de texto y un botón.
- ...
CONTENEDOR
(los contenedores
son componentes)‫‏‬

8. Contrucción de interfaces gráficos en Java 5 8. Contrucción de interfaces gráficos en Java 6

Jerarquía de clases AWT : Jerarquía de clases AWT :


patrón de diseño COMPOSITE un diseño como el siguiente sería incorrecto...

Button *

CheckBox *

TextField * Frame

*
...

• En un Frame, necesitaríamos disponer de los métodos addButton,


addCheckBox, addTextField, addFrame,... .
• Además, el diagrama no está en absoluto completo, dado que
Button puede ser un componente de Panel, o de Dialog, ... y el
diseño anterior no lo contempla.
• Si se quisiera añadir un nuevo componente XXX, deberíamos de
cambiar la clase Frame y añadir el método addXXX (esta solución
8. Contrucción de interfaces gráficos en Java
no sería nada extensible)‫‏‬
7 8. Contrucción de interfaces gráficos en Java 8
Swing: componentes principales
Jerarquía de clases AWT:
patrón de diseño COMPOSITE

Componente

Comp.Concreto1 CompConcretoN Contenedor

Contenedor ContConcreto1 ContConcreto2

add (Componente c)‫‏‬


--El método add Un contenedor está formado por
--añade un componente
--al contenedor componentes, siend éstos
componentes concretos o
contenedores. A su vez, estos
contenedores podrían tener distintos
8. Contrucción de interfaces gráficos en Java componentes, etc. 9 8. Contrucción de interfaces gráficos en Java 10

AWT/Swing: contenedores Contenedores AWT/Swing

•Frame/JFrame el principal import javax.swing.*;


public class Marco extends JFrame {
Contenedores •Panel/JPanel
•Dialog/JDialog public Markoa() {
super("Panela duen Frame baten adibidea");
initialize();
• Clases Frame/JFrame }
private void initialize() {
– Una simple ventana que ofrece iconos para maximizar, this.setSize(300, 200);
}
minimizar y cerrarla. Se le puede añadir un título.
– Único contenedor al que se le pueden añadir menús. public static void main(String[] args){
Marco thisClass = new Marco();
thisClass.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
• Clases Panel/JPanel }
thisClass.setVisible(true);

– Contenedores genéricos para agrupar componentes. } Dentro de la clase JFrame se añade un


– Clase utilizada para meter contenedores dentro de otros Panel automáticamente
contenedores (dentro de un panel, subpaneles)‫‏‬
– En Swing, dentro de la clase JFrame se añade Al cerrar el JFrame, terminar la aplicación
automáticamente un Panel. En AWT no.

8. Contrucción de interfaces gráficos en Java 11 8. Contrucción de interfaces gráficos en Java 12


Componentes principales AWT/Swing Componentes principales AWT/Swing
import javax.swing.*;
import java.awt.*;
• Clases TextField/JTextField
public class TestuEremuak extends JFrame {
– Campo de entrada de texto de una sóla línea. JLabel jLabel1 = new JLabel();
JTextField jTextField1 = new JTextField();
JLabel jLabel2 = new JLabel();
JTextArea jTextArea1 = new JTextArea();
• Clases TextArea/JTextArea
public TestuEremuak(){
– Permiten introducir líneas de texto múltiples this.setTitle("Testu-Eremuekin adibidea");
– Se puede usar también para mostrar resultados (texto)‫‏‬ jLabel1.setText("Sartu zure izena");
jTextField1.setColumns(25);
– La clase JTextArea no implementa un scroll automático. Es jLabel2.setText("Utzi zure mezua");
jTextArea1.setColumns(50);
necesario añadirlo dentro de un JScrollPane. TextArea, sin jTextArea1.setRows(10);
embargo, sí lo implementa. this.getContentPane().add(jLabel1, null);
this.getContentPane().add(jTextField1, null);
this.getContentPane().add(jLabel2, null); Ojo...
this.getContentPane().add(jTextArea1, null);
}
public static void main(String[] args){
Frame frame = new TestuEremuak();
frame.setVisible(true);
}
8. Contrucción de interfaces gráficos en Java 13 8. Contrucción de interfaces gráficos en Java 14
}

Cómo analizar/entender el API Java Componentes principales de AWT/Swing

• Clases Button/JButton
– Se usa para construir Botones.
– Al pulsar un botón se generará un evento, que habrá que
tratar.

• Clases Label/JLabel
– Utilizado para mostrar información.
– Se usan junto a los cuadros de texto.

8. Contrucción de interfaces gráficos en Java 15 8. Contrucción de interfaces gráficos en Java 16


Componentes principales AWT/Swing Componentes principales AWT/Swing

import javax.swing.*;
import java.awt.*; • Clases CheckBox/JCheckBox/JRadioButton
public class Botoiak extends JFrame
{
JButton jButton1 = new JButton();
– Casillas de verificación. Ofrecen funcionalidad para activar y
JButton jButton2 = new JButton(); desactivar opciones.
JButton jButton3 = new JButton();

public Botoiak() { – Los componentes JRadioButton los agruparemos en un


this.setTitle("Botoien adibidea");
jButton1.setText("Ireki"); ButtonGroup para conseguir seleccionar una (y sólo una)
jButton2.setText("Gorde"); opción del grupo. ButtonGroup no es un componente visual.
jButton3.setText("Ezeztatu");
this.getContentPane().add(jButton3, BorderLayout.EAST);
this.getContentPane().add(jButton2, BorderLayout.CENTER);
this.getContentPane().add(jButton1, BorderLayout.WEST);
pack();
}

public static void main(String[] args){


Frame frame = new Botoiak();
frame.setVisible(true);
}
} 8. Contrucción de interfaces gráficos en Java 17 8. Contrucción de interfaces gráficos en Java 18

AWT/Swing: contenedores AWT/Swing: componentes principales


import javax.swing.*;
import java.awt.*; import javax.swing.*;
import java.util.Vector; import java.awt.*;
jRadioButton1 jComboBox1 public class Aukerak extends JFrame{
public class Konplexua extends JFrame {
...
jRadioButton2 JPanel jPanel1 = new JPanel();
JLabel jLabel1 = new JLabel();
Button aButton = new Button("Ezabatu");
JPanel jPanel2 = new JPanel(); JRadioButton jRadioButton1 = new JRadioButton();
JTextArea jTextArea1 = new JTextArea(); jPanel2 JRadioButton jRadioButton2 = new JRadioButton();
ButtonGroup g = new ButtonGroup();
// Crear botones radiales
JRadioButton goizez = new JRadioButton("Goizez",true); JLabel jLabel2 = new JLabel();
JRadioButton arratsaldez = new JRadioButton("Arratsaldez",false); JCheckBox jCheckBox1 = new JCheckBox();
// Crear agrupación de botones JCheckBox jCheckBox2 = new JCheckBox(); //Besteak eraiki
ButtonGroup aukeraBotoiMultzoa = new ButtonGroup(); public Aukerak() {
aukeraBotoiMultzoa.add(goizez); jLabel1.setText("Sexua:");
aukeraBotoiMultzoa.add(arratsaldez);
jRadioButton1.setText("Gizona"); jRadioButton1.setSelected(true);
// Crear lista desplegable y cargarla de datos jRadioButton2.setText("Emakumea");
Vector<String> astegunak = new Vector<String>(); jLabel2.setText("Aukeratu zure ekintza gogokoenak (bat baino gehiago izan
JComboBox jComboBox1 = new JComboBox(astegunak); jTextArea1 daitezke)");
astegunak.addElement("Astelehena"); jCheckBox1.setText("Musika entzun"); jCheckBox1.setSelected(true);
astegunak.addElement("Asteartea"); jCheckBox2.setText("Dantzatu");//Besteenak testuak gehitu
astegunak.addElement("Asteazkena"); jButton1
astegunak.addElement("osteguna");
astegunak.addElement("Ostirala");
JPanel jPanel1.setLayout(new FlowLayout());
jPanel1.add(jLabel1, null);
jPanel1.add(jRadioButton2, null);
// Construir panel2
jPanel2.add(BorderLayout.EAST, goizez); jPanel1.add(jRadioButton1, null);
jPanel2.add(BorderLayout.EAST, arratsaldez); jPanel1.add(jLabel2, null);
jPanel2.add(BorderLayout.EAST, jComboBox1); jPanel1.add(jCheckBox1, null); //Beste JCheckBox-ak gehitu
// Meter en panel princ. el JPanel2, el área de texto y el botón g.add(jRadioButton1);
this.setSize(320,200); g.add(jRadioButton2);
this.getContentPane().add(BorderLayout.NORTH, jPanel2); this.getContentPane().add(jPanel1, null);
this.getContentPane().add(BorderLayout.CENTER,jTextArea1); }
this.getContentPane().add(BorderLayout.SOUTH, aButton); }
8. Contrucción de interfaces gráficos en Java 19 8. Contrucción de interfaces gráficos en Java 20
this.setVisible(true);
}
AWT/Swing: componentes principales AWT/Swing: componentes principales

• Clases List/JList import javax.swing.*;


import java.awt.*;
– Por medio de las listas desplegables, mostraremos al import java.util.*;
public class Listak extends JFrame
usuario un grupo de opciones. A menudo se usan para evitar {
la saturación de información en pantalla. JList jList1; //new gero egingo da
Vector elementuak = new Vector();
JPanel jPanel1 = new JPanel();
public Listak(){
– JList no dispone de scroll por defecto. Para ello, se this.setTitle("Listen adibidea");
debe añadir a un JScrollPane. elementuak.addElement("Java");
elementuak.addElement("Pascal");
elementuak.addElement("Cobol");
elementuak.addElement("Perl");
jList1 = new JList(elementuak);
jPanel1.add(jList1, null);
this.getContentPane().add(jPanel1, null);
elementuak.addElement("LISP"); // gehitzean, JLIST-a aldatzen da!!
}
public static void main(String[] args){
Frame frame = new Listak();
frame.setVisible(true);
}
}
8. Contrucción de interfaces gráficos en Java 21 8. Contrucción de interfaces gráficos en Java 22

AWT/Swing: componentes principales AWT/Swing: componentes principales


import javax.swing.*;
import java.util.*;
public class ZerrendaScrollekin extends JFrame {
• Clases Choice/JComboBox
JPanel jPanel1 = new JPanel();
JList jList1;
– Son listas (desplegables) de opciones.
Vector <String> elementuak = new Vector<String>(); – Las ventajas de esto: las listas de opciones no ocupan
public ZerrendaScrollekin(){
this.getContentPane().add(jPanel1, null); demasiado espacio en pantalla.
elementuak.addElement("Java");
elementuak.addElement("Pascal");
elementuak.addElement("Cobol");
elementuak.addElement("Perl");
jList1 = new Jlist(elementuak);
jList1.setVisibleRowCount(8);
//Lista scroll-a duen panel batean sartzen dugu
JScrollPane j = new JScrollPane(jList1);
jPanel1.add(j,null);
for (int i=0;i<50;i++) elementuak.addElement("LP "+i);
pack();
}
public static void main(String[] args){
ZerrendaScrollekin frame = new ZerrendaScrollekin();
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
} 8. Contrucción de interfaces gráficos en Java 23 8. Contrucción de interfaces gráficos en Java 24
AWT/Swing: componentes principales AWT/Swing: componentes principales

import javax.swing.*;
import java.util.*; • Creación de Menús
public class AukeraZerrendak extends JFrame {
– En Swing
Vector <String> elementuak = new Vector<String>();
• El único contenedor que puede alojar una barra de menú
JPanel jPanel1 = new JPanel();
JComboBox jComboBox1;//new gero egingo da es JFrame .
• La clase JMenuBar crea la barra de menú donde se
public AukeraZerrendak(){
elementuak.addElement("Java"); insertarán las opciones de dicho menú.
elementuak.addElement("Pascal"); • La clase JMenu es la encargada de crear los menús. Estos
elementuak.addElement("Cobol");
elementuak.addElement("Perl"); menús tienen un nombre asociado y muestran una lista
jComboBox1 = new JComboBox(elementuak); desplegable con varios elementos.
jPanel1.add(jComboBox1, null);
this.getContentPane().add(jPanel1, null); • Los elementos de un menú pueden ser objetos JmenuItem u
elementuak.addElement("LISP"); // beste item bat gehitzean, JLIST-a aldatzen da!! objetos JMenu (para crear menús en cascada)‫‏‬
pack();
}
public static void main(String[] args){
AukeraZerrendak frame = new AukeraZerrendak();
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
} 8. Contrucción de interfaces gráficos en Java 25 8. Contrucción de interfaces gráficos en Java 26

AWT/Swing: componentes principales AWT/Swing: componentes principales

public class Menuak extends JFrame {


• Creación de menús en Swing JMenuBar menuBarra = new JMenuBar();
JMenu fitxategi = new JMenu(); JMenu aukerak = new JMenu();
JMenu berria = new JMenu(); JMenuItem ireki = new JMenuItem();
JMenuItem gorde = new JMenuItem(); JMenuItem atera = new JMenuItem();
JMenu JMenu JMenuBar JMenuItem koloreak = new JRadioButtonMenuItem();
JMenuItem txuriBeltz = new JRadioButtonMenuItem();
ButtonGroup bg = new ButtonGroup();
JMenuItem testua = new JMenuItem(); JMenuItem grafikoa = new JMenuItem();
public Menuak() {
this.setJMenuBar(menuBarra); this.setTitle("Menuekin adibidea");
fitxategi.setText("Fitxategi"); aukerak.setText("Aukerak");
berria.setText("Berria"); grafikoa.setText("Grafikoa");
testua.setText("Testua"); ireki.setText("Ireki");
gorde.setText("Gorde"); atera.setText("Atera");
koloreak.setText("Koloreak"); txuriBeltz.setText("Txuri-beltz");
testua.setText("Testua");
berria.add(grafikoa); berria.add(testua); berria.add(testua);
fitxategi.add(berria); fitxategi.add(ireki); fitxategi.add(gorde);
fitxategi.addSeparator(); fitxategi.add(atera);
menuBarra.add(fitxategi);
aukerak.add(txuriBeltz); aukerak.add(koloreak);
bg.add(txuriBeltz); bg.add(koloreak);
menuBarra.add(aukerak);
}
JMenuItem JMenuItem public static void main(String[] args){
Menuak frame = new Menuak();
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
8. Contrucción de interfaces gráficos en Java 27 } 8. Contrucción de interfaces gráficos en Java 28
}
AWT/Swing: componentes principales AWT/Swing: componentes principales
• Inserción de imágenes • Creación dinámica de componentes
import javax.swing.*;
– Meteremos la imagen en un JLabel import java.awt.*;
import javax.swing.*; public class Saskia extends JFrame {
import java.awt.*; int N=5;
JButton[] botoiak= new JButton[N];
public class FrameIrudiekin extends JFrame {
JTextField[] testuKutxak = new JTextField[N];
JButton jButton1 = new JButton();
public Saskia(){
JButton jButton2 = new JButton();
for (int i=0; i<N; ++i){
public FrameIrudiekin() { botoiak[i] = new JButton();
this.getContentPane().setLayout(null); testuKutxak[i] = new JTextField();
this.setSize(new Dimension(400, 300)); }
this.setTitle("Irudiak nola bistaratu"); this.getContentPane().setLayout(null);
this.setSize(new Dimension(400, 300));
JLabel lb1 = new JLabel(new ImageIcon(getClass().getResource("katua.jpg"))); this.setTitle("Saskia ikusi");
this.getContentPane().add(lb1); for (int i=0; i<N; ++i){
lb1.setSize(lb1.getPreferredSize());
botoiak[i].setBounds(new Rectangle(20, 20+i*40, 80, 30));
lb1.setLocation(20,20);
botoiak[i].setText("Botoia:"+i);
JLabel lb2 = new JLabel(new ImageIcon(getClass().getResource("armiarma.jpg")));
this.getContentPane().add(lb2);
this.getContentPane().add(botoiak[i], null);
lb2.setSize(lb2.getPreferredSize()); testuKutxak[i].setBounds(new Rectangle(110, 20+i*40, 40, 30));
lb2.setLocation(20,120); this.getContentPane().add(testuKutxak[i], null);
}
jButton1.setText("Katua erosi"); }
jButton1.setBounds(new Rectangle(180, 40, 160, 30)); public static void main(String[] args){
this.getContentPane().add(jButton1, null); Saskia a = new Saskia();
jButton2.setText("Armiarma erosi"); a.setVisible(true); a.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
8. Contrucción de interfaces
jButton2.setBounds(new gráficos en 140,
Rectangle(180, Java 160, 30)); 29 8. Contrucción de interfaces gráficos en Java 30
}
this.getContentPane().add(jButton2, null); }

Gestores de Diseño: Layout Gestores de Diseño: Layout

• Se usan para definir dónde colocar un componente • Si se quiere poner el componente en unas
dentro de un contenedor. coordenadas concretas, se debe de eliminar el gestor
edukiontzia.add(osagaia); de diseño.
• FlowLayout (Gestor predeterminado para Panel)‫‏‬ osagaia.setLayout(null);
– Los componentes se van añadiendo a una línea. Al
completar la línea, se pasa a la siguiente.
• Sean this un contenedor y textField1 uno de sus
• BorderLayout (Gestor predeterminado para Frame y componentes:
Dialog )‫‏‬ setLayout(null);
– Los componentes se añaden en una de estas 5 zonas: textField1.setBounds(15,20,50,60);
norte, sur, este, oeste y centro.
• Se puede cambiar el gestor predeterminado: x y zabalera altuera

edukiontzia.setLayout(new BorderLayout());

8. Contrucción de interfaces gráficos en Java 31 8. Contrucción de interfaces gráficos en Java 32


Gestores de Diseño: Layout Gestores de Diseño: Layout jPanel1

public class Layoutak extends JFrame {


Etiqueta en BorderLayout.NORTH Panel con BorderLayout JPanel jPanel1 = new JPanel();
JPanel jPanel2 = new JPanel();
JPanel jPanel3 = new JPanel();
BorderLayout borderLayout1 = new BorderLayout();
GridLayout gridLayout1 = new GridLayout(4,3);
JLabel jLabel1 = new JLabel();//...
public Layoutak(){
jPanel1.setLayout(borderLayout1);
jLabel1.setText("Gustatzen?");
jCheckBox1.setText("Bai");
jCheckBox2.setText("Ez");
jLabel2.setText("Aukeratu eta botoi bat sakatu");
jPanel3
jLabel2.setHorizontalAlignment(SwingConstants.CENTER); jPanel2
jPanel3.setLayout(gridLayout1);
jRadioButton1.setText("A");//...
jPanel3.add(jRadioButton1, null);
jPanel3.add(jButton1, null);
jPanel3.add(jButton2, null);
jPanel3.add(jRadioButton2, null);//...
jPanel2.add(jLabel1, null);
jPanel2.add(jCheckBox1, null);
jPanel2.add(jCheckBox2, null);
jPanel1.add(jLabel2, BorderLayout.NORTH);
Panel en BorderLayout.CENTER. Este panel Panel en BorderLayout.SOUTH. Éste panel jPanel1.add(jPanel3, BorderLayout.CENTER);
jPanel1.add(jPanel2, BorderLayout.SOUTH);
tiene un GridLayout(4,3)‫‏‬ tiene un FlowLayout. this.getContentPane().add(jPanel1, null);
8. Contrucción de interfaces gráficos en Java 33 } 8. Contrucción de interfaces gráficos en Java 34

Gestores de Diseño: Layout Gestores de Diseño: Layout

• Ventajas de definir un GUI con gestor de diseño: • Sin gestor de diseño se definen las coordenadas de
– los componentes se redibujan automáticamente al ajustar el todos los componentes
tamaño de la ventana (ajustándose al tamaño disponible). – fácil de hacer con herramientas visuales.
jPanel1.setBounds(new Rectangle(3, 0, 333, 170));
jPanel1.setLayout(null);

jLabel1.setText("Gustatzen");
jLabel1.setBounds(new Rectangle(66, 18, 62, 16));
jPanel1.add(jLabel1,null);

jCheckBox1.setText("Bai");
jCheckBox1.setBounds(new Rectangle(142, 17, 48, 19));
jPanel1.add(jCheckBox1,null);
jCheckBox2.setText("Ez");
jCheckBox2.setBounds(new Rectangle(201, 17, 44, 21));

jRadioButton1.setText("A");
jRadioButton1.setBounds(new Rectangle(14, 10, 49, 23));
jRadioButton2.setText("B");
jRadioButton2.setBounds(new Rectangle(14, 40, 58, 23));
jRadioButton3.setText("C");
jRadioButton3.setBounds(new Rectangle(14, 70, 55, 23));
jButton1.setText("A1");
jButton1.setBounds(new Rectangle(139, 10, 80, 23));
8. Contrucción de interfaces gráficos en Java 35 8. Contrucción de interfaces gráficos en Java 36
//...
Gestores de Diseño: Layout Otros contenedores

• Desventajas de no usar un gestor de diseño: • Clases Dialog/JDialog/JOptionPane


– Al redimensionar el Frame, los componentes se mantienen sin – Ventana para leer o mostrar datos del usuario.
cambiar su posición (no se ajustarn al tamaño disponible). – Si las hacemos MODAL , no podremos cambiar de ventana
mientras el diálogo siga activo.

• Clase JFileChooser (Swing)

8. Contrucción de interfaces gráficos en Java 37 8. Contrucción de interfaces gráficos en Java 38

Gestión de Eventos Gestión de Eventos


import javax.swing.*;
• Al diseñar un interfaz gráfico debemos de tener en
cuenta que a consecuencia de las acciones del public class SimpleGUI extends JFrame {

usuario se generarán distintos eventos. JButton button;

• Se deben de programar métodos para responder a public void ekin(){


estos eventos provocados por el usuario. button = new JButton("sakatu hemen");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
getContentPane().add(button);
setSize(300,300);
• Un evento: }
setVisible(true);

– es generado por una acción del usuario.


public static void main(String[] args){
– está ligado a un componente del GUI. SimpleGUI frame = new SimpleGUI();
– Ejemplos: frame.setTitle("gertaeren kudeaketa");
frame.ekin();
• pulsar una tecla, mover el ratón, cambiar el tamaño de una }
ventana, cerrarla, minimizarla, pulsar un botón, perder u
obtener el foco de un componente, cambiar el valor de un }
campo de texto, elegir una opción de menú...

8. Contrucción de interfaces gráficos en Java 39 8. Contrucción de interfaces gráficos en Java 40


Gestión de Eventos Gestión de Eventos

1
public void cambiarTexto(){
Queremos saber cuándo el usuario button.setText(“ok! has pulsado el botón”);
pulsa el botón. Al pulsarlo, se }
generará un evento

2
Si queremos hacer algo cuando se pulse el botón:
1) deberemos de programar un método , para responder al evento que se genera.
Pero ¿cómo saber cuándo ha pulsado el botón el usuario?
2) tendremos que saber cuándo se genera el evento.

8. Contrucción de interfaces gráficos en Java 41 8. Contrucción de interfaces gráficos en Java 42

<<interface>>
ActionListener

Gestión de Eventos (event-handling)‫‏‬ Gestión de Eventos actionPerformed(ActionEvent ev)‫‏‬

si queremos estar informados sobre los eventos que


ocurran en un botón, debemos de implementar un
quiero que me informes interfaz listener (listener interface)‫‏‬
Aplicación
1

el usuario me ha pulsado!
2

8. Contrucción de interfaces gráficos en Java 43 8. Contrucción de interfaces gráficos en Java 44


<<interfaze>> <<interfaze>>
ActionListener ActionListener

Gestión de Eventos actionPerformed(ActionEvent ev)‫‏‬ Gestión de Eventos actionPerformed(ActionEvent ev)‫‏‬

button.addActionListener(this)‫‏‬
Ok!, implemento el interfaz ActionListener. Ahora quiero recoger tus eventos.

aplicación

actionPerformed(ActionEvent ev)‫‏‬
botón

registrarse en el F
botón para “oír” Ev uen
sus eventos n er en t e
Li s te actionPerformed(evento)‫‏‬
to de
s

8. Contrucción de interfaces gráficos en Java 45 8. Contrucción de interfaces gráficos en Java 46

Gestión de Eventos Gestión de Eventos


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

public class SimpleGUI extends JFrame implements ActionListener { Siendo un listener: Como fuente de eventos:
1) debo de implementar un interfaz 1) debo aceptar el registro de listerners
JButton button;
2) para oír los eventos del botón, me debo 2) debo admitir acciones de los usuarios
public void ekin(){ 3) al recibir una acción del usuario, debo
button = new JButton("sakatu hemen"); registrar en el botón como listener.
avisar del evento a mis listeners
button.addActionListener(this); 3) para responder a los eventos, debo ofrecer
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
getContentPane().add(button); un método .
setSize(300,300);
setVisible(true);
}

public static void main(String[] args){


SimpleGUI frame = new SimpleGUI();
frame.ekin();
} Ey! Y yo qué?
public void actionPerformed(ActionEvent e) {
button.setText("ados! botoia sakatu duzu!");

}
La fuente de eventos
evento enviará el evento
}

public void actionPerformed(ActionEvent e) {

El listener recibirá los eventos


8. Contrucción de interfaces gráficos en Java 47 8. Contrucción de interfaces gráficos en Java 48
Gestión de Eventos Gestión de Eventos

import java.awt.BorderLayout; public void go(){


import java.awt.FlowLayout; bg.add(emakumea);
import java.awt.event.ActionEvent; bg.add(gizona);
import java.awt.event.ActionListener; emakumea.addActionListener(new GertaeraKudeatzaile());
import javax.swing.*; gizona.addActionListener(new GertaeraKudeatzaile());
this.getContentPane().setLayout(new FlowLayout());
public class Aukerak2 extends JFrame{ getContentPane().add(jLabel1,null);
getContentPane().add(emakumea,null);
JLabel jLabel1 = new JLabel("Sexua:"); getContentPane().add(gizona,null);
JLabel jLabel2 = new JLabel("Aukeratu duzun sexua:"); getContentPane().add(jLabel2,null);
JLabel emaitza = new JLabel(); getContentPane().add(emaitza,null);
JRadioButton emakumea = new JRadioButton("Emakumea", true); setSize(300,200);
JRadioButton gizona = new JRadioButton("Gizona", false); setVisible(true);
ButtonGroup bg = new ButtonGroup(); }
public Aukerak2() { public class GertaeraKudeatzaile implements ActionListener {
super("Gertaerak kudeatzen...");
} public void actionPerformed(ActionEvent e) {
emaitza.setText(e.getActionCommand());
}
}
public void actionPerformed(ActionEvent e) {
button.setText("botoia sakatu duzu!"); public static void main(String[] args){
Aukerak2 proba = new Aukerak2();
if ( (e.getModifiers() & ActionEvent.SHIFT_MASK) != 0)‫‏‬ proba.go();
proba.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
button.setText(button.getText() + " baita Shift tekla ere!"); }
}

8. Contrucción de interfaces gráficos en Java 49 8. Contrucción de interfaces gráficos en Java 50

Gestión de Eventos Componentes gráficos y Listeners (observadores)‫‏‬


public void go(){
public void go(){ bg.add(emakumea);
bg.add(emakumea);

• Un componente gráfico puede aceptar el registro de


bg.add(gizona); bg.add(gizona);
emakumea.addActionListener(new GertaeraKudeatzaile());
gizona.addActionListener(new GertaeraKudeatzaile());
emakumea.addActionListener(new ActionListener(){
this.getContentPane().setLayout(new FlowLayout()); public void actionPerformed(ActionEvent e) {
getContentPane().add(jLabel1,null);
getContentPane().add(emakumea,null); emaitza.setText(e.getActionCommand());

objetos observadores (listeners) que implementen el


getContentPane().add(gizona,null);
getContentPane().add(jLabel2,null);
}
getContentPane().add(emaitza,null); });
setSize(300,200);
setVisible(true);
}
gizona.addActionListener(new ActionListener(){
public class GertaeraKudeatzaile implements ActionListener { public void actionPerformed(ActionEvent e) { interfaz adecuado
public void actionPerformed(ActionEvent e) {
emaitza.setText(e.getActionCommand());
}
emaitza.setText(e.getActionCommand()); }
} });
this.getContentPane().setLayout(new FlowLayout());
addXXXListener()‫‏‬
getContentPane().add(jLabel1,null);
getContentPane().add(emakumea,null);
getContentPane().add(gizona,null); - Por ejemplo:
getContentPane().add(jLabel2,null);
getContentPane().add(emaitza,null);
setSize(300,200); addActionListener(ActionListener observador)‫‏‬
setVisible(true);
}

addItemListener(ItemListener observador)‫‏‬
8. Contrucción de interfaces gráficos en Java 51 8. Contrucción de interfaces gráficos en Java
Componentes gráficos y Listeners (observadores)‫‏‬ Componentes gráficos y Listeners (observadores)‫‏‬

• Una clase Adapter implementa todos los métodos de


• Algunos observadores (listeners) disponen de
un interfaz, dejándolos con un cuerpo vacío.
numerosos métodos, siendo probable que no
necesitemos usar todos (dado que no queremos
responder a todo posible evento) • Ejemplo: si sólo quiero gestionar el cierre de una
ventana:
• Java, no obstante, obliga a implementar todos los myframe.addWindowListener(new WindowAdapter() {

métodos de un interfaz public void windowClosing(WindowEvent winEvt) {

System.exit(0); } } );

• Para evitar esa situación (usar sólo un método de un Frente a implementar (usando WindowListener)
interfaz, pero tener que programarlos todos), Java void windowActivated(WindowEvent e);

ofrece clases Adapter. void windowClosed(WindowEvent e) void windowDeactivated(WindowEvent e)


void windowDeiconified(WindowEvent e)
void windowClosing(WindowEvent e)
void windowIconified(WindowEvent e)
8. Contrucción de interfaces gráficos en Java 8. Contrucción de interfaces gráficos en Java void windowOpened(WindowEvent e)

También podría gustarte