Contrucción de interfacesgráficas en Java
AWT y Swing
1.
8. Contrucción de interfaces gráficos en Java 2
Índice
• Introducción– Objetivos– Jerarquia de clases: patrón de diseño COMPOSITE
• Componentes principales– Contenedores AWT/Swing – Componentes AWT/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 3
Introducción
• Cualquier lenguaje de programación moderno ofrece herramientas para la contrucción de interfaces gráficas de usuario (GUI).
• Java permite al programador:– El diseño y programación de interfaces gráficas de usuario de
forma rápida y sencilla. – El paquete de clases AWT (Abstract Window Toolkit)– El paquete de clases Swing
• Swing es una evolución de AWT, ofreciendo más clases y una mayor flexibilidad.
8. Contrucción de interfaces gráficos en Java 4
Objetivos
• Entender el diseño de la jerarquía de clases Java que se utilizan para la construcción de GUIs.
• Entender cómo se realiza la gestión de eventos.
• Aprender a usar un entorno de programación (Eclipse, Jbuilder, Jdeveloper...) para construir GUIs
• No es un objetivo:- conocer todos los nombres de clases, interfaces y demás componentes gráficos
Evento
8. Contrucción de interfaces gráficos en Java 5
AWT: componentes principales
• Jerarquía de clases AWT
COMPONENTE
CONTENEDOR(los contenedores son componentes)
8. Contrucción de interfaces gráficos en Java 6
Jerarquía de clases AWT : patrón de diseño COMPOSITE
Las opciones son infinitas:- Una ventana con 2 campos de
texto, 3 botones y 2 áreas de 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.
- ...
8. Contrucción de interfaces gráficos en Java 7
Jerarquía de clases AWT : patrón de diseño COMPOSITE
8. Contrucción de interfaces gráficos en Java 8
Jerarquía de clases AWT : un diseño como el siguiente sería incorrecto...
• 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 no sería nada extensible)
Button
TextField
CheckBox
*
*
* Frame
* ...
8. Contrucción de interfaces gráficos en Java 9
Jerarquía de clases AWT: patrón de diseño COMPOSITE
Un contenedor está formado por componentes, siend éstos componentes concretos o contenedores. A su vez, estos contenedores podrían tener distintos componentes, etc.
Contenedor
add (Componente c) --El método add --añade un componente--al contenedor
Componente
Comp.Concreto1 CompConcretoN Contenedor
ContConcreto1 ContConcreto2
8. Contrucción de interfaces gráficos en Java 10
Swing: componentes principales
8. Contrucción de interfaces gráficos en Java 11
AWT/Swing: contenedores
Contenedores
• Clases Frame/JFrame– Una simple ventana que ofrece iconos para maximizar,
minimizar y cerrarla. Se le puede añadir un título.– Único contenedor al que se le pueden añadir menús.
• Clases Panel/JPanel– Contenedores genéricos para agrupar componentes.– Clase utilizada para meter contenedores dentro de otros
contenedores (dentro de un panel, subpaneles)– En Swing, dentro de la clase JFrame se añade
automáticamente un Panel. En AWT no.
el principal•Frame/JFrame•Panel/JPanel•Dialog/JDialog
8. Contrucción de interfaces gráficos en Java 12
Contenedores AWT/Swing
import javax.swing.*;public class Marco extends JFrame {
public Markoa() {super("Panela duen Frame baten adibidea");initialize();
}private void initialize() {
this.setSize(300, 200);}
public static void main(String[] args){Marco thisClass = new Marco();thisClass.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);thisClass.setVisible(true);
}}
Al cerrar el JFrame, terminar la aplicación
Dentro de la clase JFrame se añade un Panel automáticamente
8. Contrucción de interfaces gráficos en Java 13
Componentes principales AWT/Swing
• Clases TextField/JTextField– Campo de entrada de texto de una sóla línea.
• Clases TextArea/JTextArea – Permiten introducir líneas de texto múltiples– Se puede usar también para mostrar resultados (texto) – La clase JTextArea no implementa un scroll automático. Es
necesario añadirlo dentro de un JScrollPane. TextArea, sin embargo, sí lo implementa.
8. Contrucción de interfaces gráficos en Java 14
Componentes principales AWT/Swing
import javax.swing.*;import java.awt.*;
public class TestuEremuak extends JFrame {JLabel jLabel1 = new JLabel();JTextField jTextField1 = new JTextField();JLabel jLabel2 = new JLabel();JTextArea jTextArea1 = new JTextArea();
public TestuEremuak(){this.setTitle("Testu-Eremuekin adibidea");jLabel1.setText("Sartu zure izena");jTextField1.setColumns(25);jLabel2.setText("Utzi zure mezua");jTextArea1.setColumns(50);jTextArea1.setRows(10);this.getContentPane().add(jLabel1, null); this.getContentPane().add(jTextField1, null);this.getContentPane().add(jLabel2, null);this.getContentPane().add(jTextArea1, null);
}public static void main(String[] args){
Frame frame = new TestuEremuak();frame.setVisible(true);
}}
Ojo...
8. Contrucción de interfaces gráficos en Java 15
Cómo analizar/entender el API Java
8. Contrucción de interfaces gráficos en Java 16
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 17
Componentes principales AWT/Swing
import javax.swing.*;import java.awt.*;
public class Botoiak extends JFrame {
JButton jButton1 = new JButton();JButton jButton2 = new JButton();JButton jButton3 = new JButton();
public Botoiak() {this.setTitle("Botoien adibidea");jButton1.setText("Ireki");jButton2.setText("Gorde");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 18
Componentes principales AWT/Swing
• Clases CheckBox/JCheckBox/JRadioButton
– Casillas de verificación. Ofrecen funcionalidad para activar y desactivar opciones.
– Los componentes JRadioButton los agruparemos en un ButtonGroup para conseguir seleccionar una (y sólo una) opción del grupo. ButtonGroup no es un componente visual.
8. Contrucción de interfaces gráficos en Java 19
AWT/Swing: contenedores
import javax.swing.*;import java.awt.*;import java.util.Vector;public class Konplexua extends JFrame {...Button aButton = new Button("Ezabatu");JPanel jPanel2 = new JPanel();JTextArea jTextArea1 = new JTextArea();// Crear botones radialesJRadioButton goizez = new JRadioButton("Goizez",true);JRadioButton arratsaldez = new JRadioButton("Arratsaldez",false);// Crear agrupación de botonesButtonGroup aukeraBotoiMultzoa = new ButtonGroup();aukeraBotoiMultzoa.add(goizez);aukeraBotoiMultzoa.add(arratsaldez);// Crear lista desplegable y cargarla de datosVector<String> astegunak = new Vector<String>();JComboBox jComboBox1 = new JComboBox(astegunak);astegunak.addElement("Astelehena");astegunak.addElement("Asteartea"); astegunak.addElement("Asteazkena");astegunak.addElement("osteguna");astegunak.addElement("Ostirala");
// Construir panel2jPanel2.add(BorderLayout.EAST, goizez);jPanel2.add(BorderLayout.EAST, arratsaldez);jPanel2.add(BorderLayout.EAST, jComboBox1);// Meter en panel princ. el JPanel2, el área de texto y el botónthis.setSize(320,200);this.getContentPane().add(BorderLayout.NORTH, jPanel2);this.getContentPane().add(BorderLayout.CENTER,jTextArea1);this.getContentPane().add(BorderLayout.SOUTH, aButton);this.setVisible(true);}
jRadioButton1jRadioButton2
jComboBox1
jButton1JPanel
jPanel2
jTextArea1
8. Contrucción de interfaces gráficos en Java 20
AWT/Swing: componentes principales
import javax.swing.*;import java.awt.*;public class Aukerak extends JFrame{ JPanel jPanel1 = new JPanel();JLabel jLabel1 = new JLabel();JRadioButton jRadioButton1 = new JRadioButton();JRadioButton jRadioButton2 = new JRadioButton();ButtonGroup g = new ButtonGroup();JLabel jLabel2 = new JLabel();JCheckBox jCheckBox1 = new JCheckBox();JCheckBox jCheckBox2 = new JCheckBox(); //Besteak eraikipublic Aukerak() {
jLabel1.setText("Sexua:");jRadioButton1.setText("Gizona"); jRadioButton1.setSelected(true);jRadioButton2.setText("Emakumea"); jLabel2.setText("Aukeratu zure ekintza gogokoenak (bat baino gehiago izan daitezke)");jCheckBox1.setText("Musika entzun"); jCheckBox1.setSelected(true);jCheckBox2.setText("Dantzatu");//Besteenak testuak gehitujPanel1.setLayout(new FlowLayout());jPanel1.add(jLabel1, null);jPanel1.add(jRadioButton2, null);jPanel1.add(jRadioButton1, null);jPanel1.add(jLabel2, null);jPanel1.add(jCheckBox1, null); //Beste JCheckBox-ak gehitug.add(jRadioButton1);g.add(jRadioButton2);this.getContentPane().add(jPanel1, null);
}}
8. Contrucción de interfaces gráficos en Java 21
AWT/Swing: componentes principales
• Clases List/JList – Por medio de las listas desplegables, mostraremos al
usuario un grupo de opciones. A menudo se usan para evitar la saturación de información en pantalla.
– JList no dispone de scroll por defecto. Para ello, se debe añadir a un JScrollPane.
8. Contrucción de interfaces gráficos en Java 22
AWT/Swing: componentes principales
import javax.swing.*;import java.awt.*;import java.util.*;public class Listak extends JFrame {
JList jList1; //new gero egingo daVector elementuak = new Vector();JPanel jPanel1 = new JPanel();public Listak(){this.setTitle("Listen adibidea");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 23
AWT/Swing: componentes principalesimport javax.swing.*;import java.util.*;public class ZerrendaScrollekin extends JFrame {
JPanel jPanel1 = new JPanel();JList jList1;Vector <String> elementuak = new Vector<String>();public ZerrendaScrollekin(){
this.getContentPane().add(jPanel1, null);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 24
AWT/Swing: componentes principales
• Clases Choice/JComboBox– Son listas (desplegables) de opciones.– Las ventajas de esto: las listas de opciones no ocupan
demasiado espacio en pantalla.
8. Contrucción de interfaces gráficos en Java 25
AWT/Swing: componentes principales
import javax.swing.*;import java.util.*;public class AukeraZerrendak extends JFrame {
Vector <String> elementuak = new Vector<String>();JPanel jPanel1 = new JPanel();JComboBox jComboBox1;//new gero egingo da
public AukeraZerrendak(){elementuak.addElement("Java");
elementuak.addElement("Pascal");elementuak.addElement("Cobol");elementuak.addElement("Perl");jComboBox1 = new JComboBox(elementuak);jPanel1.add(jComboBox1, null);this.getContentPane().add(jPanel1, null);elementuak.addElement("LISP"); // beste item bat gehitzean, JLIST-a aldatzen da!!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 26
AWT/Swing: componentes principales
• Creación de Menús– En Swing
• El único contenedor que puede alojar una barra de menúes JFrame .
• La clase JMenuBar crea la barra de menú donde se insertarán las opciones de dicho menú.
• La clase JMenu es la encargada de crear los menús. Estos menús tienen un nombre asociado y muestran una lista desplegable con varios elementos.
• Los elementos de un menú pueden ser objetos JmenuItem u objetos JMenu (para crear menús en cascada)
8. Contrucción de interfaces gráficos en Java 27
AWT/Swing: componentes principales
• Creación de menús en Swing
JMenuJMenu JMenuBar
JMenuItemJMenuItem
8. Contrucción de interfaces gráficos en Java 28
AWT/Swing: componentes principales
public class Menuak extends JFrame {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();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);
}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 29
AWT/Swing: componentes principales
• Inserción de imágenes– Meteremos la imagen en un JLabel
import javax.swing.*;import java.awt.*;
public class FrameIrudiekin extends JFrame {JButton jButton1 = new JButton();JButton jButton2 = new JButton();
public FrameIrudiekin() {this.getContentPane().setLayout(null);this.setSize(new Dimension(400, 300));this.setTitle("Irudiak nola bistaratu");
JLabel lb1 = new JLabel(new ImageIcon(getClass().getResource("katua.jpg")));this.getContentPane().add(lb1);lb1.setSize(lb1.getPreferredSize());lb1.setLocation(20,20);JLabel lb2 = new JLabel(new ImageIcon(getClass().getResource("armiarma.jpg")));this.getContentPane().add(lb2);lb2.setSize(lb2.getPreferredSize());lb2.setLocation(20,120);
jButton1.setText("Katua erosi");jButton1.setBounds(new Rectangle(180, 40, 160, 30));this.getContentPane().add(jButton1, null);jButton2.setText("Armiarma erosi");jButton2.setBounds(new Rectangle(180, 140, 160, 30));this.getContentPane().add(jButton2, null);
8. Contrucción de interfaces gráficos en Java 30
AWT/Swing: componentes principales
• Creación dinámica de componentesimport javax.swing.*;import java.awt.*;public class Saskia extends JFrame {
int N=5;JButton[] botoiak= new JButton[N];JTextField[] testuKutxak = new JTextField[N];public Saskia(){
for (int i=0; i<N; ++i){botoiak[i] = new JButton();testuKutxak[i] = new JTextField();
}this.getContentPane().setLayout(null);this.setSize(new Dimension(400, 300));this.setTitle("Saskia ikusi");
for (int i=0; i<N; ++i){ botoiak[i].setBounds(new Rectangle(20, 20+i*40, 80, 30));botoiak[i].setText("Botoia:"+i);this.getContentPane().add(botoiak[i], null);testuKutxak[i].setBounds(new Rectangle(110, 20+i*40, 40, 30));this.getContentPane().add(testuKutxak[i], null);
}}public static void main(String[] args){
Saskia a = new Saskia();a.setVisible(true); a.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}}
8. Contrucción de interfaces gráficos en Java 31
Gestores de Diseño: Layout
• Se usan para definir dónde colocar un componente dentro de un contenedor.
edukiontzia.add(osagaia);• FlowLayout (Gestor predeterminado para Panel)
– Los componentes se van añadiendo a una línea. Al completar la línea, se pasa a la siguiente.
• BorderLayout (Gestor predeterminado para Frame y Dialog ) – Los componentes se añaden en una de estas 5 zonas:
norte, sur, este, oeste y centro.
• Se puede cambiar el gestor predeterminado:edukiontzia.setLayout(new BorderLayout());
8. Contrucción de interfaces gráficos en Java 32
Gestores de Diseño: Layout
• Si se quiere poner el componente en unas coordenadas concretas, se debe de eliminar el gestor de diseño.
osagaia.setLayout(null);
• Sean this un contenedor y textField1 uno de sus componentes:
setLayout(null); textField1.setBounds(15,20,50,60);
x y zabalera altuera
8. Contrucción de interfaces gráficos en Java 33
Gestores de Diseño: Layout
Etiqueta en BorderLayout.NORTH Panel con BorderLayout
Panel en BorderLayout.CENTER. Este panel tiene un GridLayout(4,3)
Panel en BorderLayout.SOUTH. Éste panel tiene un FlowLayout.
8. Contrucción de interfaces gráficos en Java 34
public class Layoutak extends JFrame {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");jLabel2.setHorizontalAlignment(SwingConstants.CENTER);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);jPanel1.add(jPanel3, BorderLayout.CENTER);jPanel1.add(jPanel2, BorderLayout.SOUTH);this.getContentPane().add(jPanel1, null);
}
Gestores de Diseño: LayoutjPanel1
jPanel2jPanel3
8. Contrucción de interfaces gráficos en Java 35
Gestores de Diseño: Layout
• Ventajas de definir un GUI con gestor de diseño:– los componentes se redibujan automáticamente al ajustar el
tamaño de la ventana (ajustándose al tamaño disponible).
8. Contrucción de interfaces gráficos en Java 36
Gestores de Diseño: Layout
• Sin gestor de diseño se definen las coordenadas de todos los componentes – 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 37
Gestores de Diseño: Layout
• Desventajas de no usar un gestor de diseño:– Al redimensionar el Frame, los componentes se mantienen sin
cambiar su posición (no se ajustarn al tamaño disponible).
8. Contrucción de interfaces gráficos en Java 38
Otros contenedores
• Clases Dialog/JDialog/JOptionPane – Ventana para leer o mostrar datos del usuario.– 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 39
Gestión de Eventos
• Al diseñar un interfaz gráfico debemos de tener en cuenta que a consecuencia de las acciones del usuario se generarán distintos eventos.
• Se deben de programar métodos para responder a estos eventos provocados por el usuario.
• Un evento:– es generado por una acción del usuario.– está ligado a un componente del GUI.– Ejemplos:
• 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 40
import javax.swing.*;
public class SimpleGUI extends JFrame {
JButton button;
public void ekin(){button = new JButton("sakatu hemen");setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);getContentPane().add(button);setSize(300,300);setVisible(true);
}
public static void main(String[] args){SimpleGUI frame = new SimpleGUI();frame.setTitle("gertaeren kudeaketa");frame.ekin();
}
}
Gestión de Eventos
8. Contrucción de interfaces gráficos en Java 41
Si queremos hacer algo cuando se pulse el botón: 1) deberemos de programar un método , para responder al evento que se genera.2) tendremos que saber cuándo se genera el evento.
Gestión de Eventos
Queremos saber cuándo el usuario pulsa el botón. Al pulsarlo, se generará un evento
8. Contrucción de interfaces gráficos en Java 42
Gestión de Eventos
public void cambiarTexto(){button.setText(“ok! has pulsado el botón”);
}
1
2
Pero ¿cómo saber cuándo ha pulsado el botón el usuario?
8. Contrucción de interfaces gráficos en Java 43
Gestión de Eventos (event-handling)
Aplicaciónquiero que me informes
1
el usuario me ha pulsado!2
8. Contrucción de interfaces gráficos en Java 44
Gestión de Eventos
si queremos estar informados sobre los eventos que ocurran en un botón, debemos de implementar un interfaz listener (listener interface)
<<interface>>ActionListener
actionPerformed(ActionEvent ev)
8. Contrucción de interfaces gráficos en Java 45
Gestión de Eventos
aplicación
botón
Ok!, implemento el interfaz ActionListener. Ahora quiero recoger tus eventos.
actionPerformed(ActionEvent ev)
<<interfaze>>ActionListener
actionPerformed(ActionEvent ev)
registrarse en el botón para “oír”sus eventos
8. Contrucción de interfaces gráficos en Java 46
Gestión de Eventos
Listener
Fuente de
Eventos
button.addActionListener(this)
actionPerformed(evento)
<<interfaze>>ActionListener
actionPerformed(ActionEvent ev)
8. Contrucción de interfaces gráficos en Java 47
Gestión de Eventos
import java.awt.event.*;import javax.swing.*;
public class SimpleGUI extends JFrame implements ActionListener {
JButton button;
public void ekin(){button = new JButton("sakatu hemen");button.addActionListener(this);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);getContentPane().add(button);setSize(300,300);setVisible(true);
}
public static void main(String[] args){SimpleGUI frame = new SimpleGUI();frame.ekin();
}
public void actionPerformed(ActionEvent e) {button.setText("ados! botoia sakatu duzu!");
}
}
8. Contrucción de interfaces gráficos en Java 48
Gestión de Eventos
Siendo un listener:1) debo de implementar un interfaz 2) para oír los eventos del botón, me debo registrar en el botón como listener.3) para responder a los eventos, debo ofrecer un método .
El listener recibirá los eventos
Como fuente de eventos:1) debo aceptar el registro de listerners2) debo admitir acciones de los usuarios3) al recibir una acción del usuario, debo avisar del evento a mis listeners
La fuente de eventos enviará el eventoevento
Ey! Y yo qué?
public void actionPerformed(ActionEvent e) {
8. Contrucción de interfaces gráficos en Java 49
Gestión de Eventos
public void actionPerformed(ActionEvent e) {button.setText("botoia sakatu duzu!");if ( (e.getModifiers() & ActionEvent.SHIFT_MASK) != 0)
button.setText(button.getText() + " baita Shift tekla ere!");
}
8. Contrucción de interfaces gráficos en Java 50
Gestión de Eventos
import java.awt.BorderLayout;import java.awt.FlowLayout;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import javax.swing.*;
public class Aukerak2 extends JFrame{
JLabel jLabel1 = new JLabel("Sexua:");JLabel jLabel2 = new JLabel("Aukeratu duzun sexua:");JLabel emaitza = new JLabel();JRadioButton emakumea = new JRadioButton("Emakumea", true);JRadioButton gizona = new JRadioButton("Gizona", false);ButtonGroup bg = new ButtonGroup();
public Aukerak2() {super("Gertaerak kudeatzen...");
}
public void go(){bg.add(emakumea);bg.add(gizona);emakumea.addActionListener(new GertaeraKudeatzaile());gizona.addActionListener(new GertaeraKudeatzaile());this.getContentPane().setLayout(new FlowLayout());getContentPane().add(jLabel1,null);getContentPane().add(emakumea,null);getContentPane().add(gizona,null);getContentPane().add(jLabel2,null);getContentPane().add(emaitza,null);setSize(300,200);setVisible(true);
}
public class GertaeraKudeatzaile implements ActionListener {
public void actionPerformed(ActionEvent e) {emaitza.setText(e.getActionCommand());
}}
public static void main(String[] args){Aukerak2 proba = new Aukerak2();proba.go();proba.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}}
8. Contrucción de interfaces gráficos en Java 51
Gestión de Eventos
public void go(){bg.add(emakumea);bg.add(gizona);emakumea.addActionListener(new GertaeraKudeatzaile());gizona.addActionListener(new GertaeraKudeatzaile());this.getContentPane().setLayout(new FlowLayout());getContentPane().add(jLabel1,null);getContentPane().add(emakumea,null);getContentPane().add(gizona,null);getContentPane().add(jLabel2,null);getContentPane().add(emaitza,null);setSize(300,200);setVisible(true);
}
public class GertaeraKudeatzaile implements ActionListener {
public void actionPerformed(ActionEvent e) {emaitza.setText(e.getActionCommand());
}}
public void go(){bg.add(emakumea);bg.add(gizona);emakumea.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e) {emaitza.setText(e.getActionCommand());
}});
gizona.addActionListener(new ActionListener(){public void actionPerformed(ActionEvent e) {
emaitza.setText(e.getActionCommand()); }});this.getContentPane().setLayout(new FlowLayout());getContentPane().add(jLabel1,null);getContentPane().add(emakumea,null);getContentPane().add(gizona,null);getContentPane().add(jLabel2,null);getContentPane().add(emaitza,null);setSize(300,200);setVisible(true);}
8. Contrucción de interfaces gráficos en Java
Componentes gráficos y Listeners (observadores)
• Un componente gráfico puede aceptar el registro de
objetos observadores (listeners) que implementen el
interfaz adecuado
addXXXListener()
- Por ejemplo:
addActionListener(ActionListener observador)
addItemListener(ItemListener observador)
8. Contrucción de interfaces gráficos en Java
Componentes gráficos y Listeners (observadores)
• Algunos observadores (listeners) disponen de numerosos métodos, siendo probable que no necesitemos usar todos (dado que no queremos responder a todo posible evento)
• Java, no obstante, obliga a implementar todos los métodos de un interfaz
• Para evitar esa situación (usar sólo un método de un interfaz, pero tener que programarlos todos), Java ofrece clases Adapter.
8. Contrucción de interfaces gráficos en Java
Componentes gráficos y Listeners (observadores)
• Una clase Adapter implementa todos los métodos de un interfaz, dejándolos con un cuerpo vacío.
• Ejemplo: si sólo quiero gestionar el cierre de una ventana:myframe.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent winEvt) {
System.exit(0); } } );
Frente a implementar (usando WindowListener)void windowActivated(WindowEvent e);
void windowClosed(WindowEvent e)
void windowClosing(WindowEvent e)
void windowDeactivated(WindowEvent e)
void windowDeiconified(WindowEvent e)
void windowIconified(WindowEvent e)
void windowOpened(WindowEvent e)