Professional Documents
Culture Documents
ndice
Introduccin Objetivos Jerarquia de clases: patrn de diseo COMPOSITE Componentes principales Contenedores AWT/Swing Componentes AWT/Swing Gestores de diseo Gestin de eventos
Clases Listener Clases Adapter
Introduccin
Cualquier lenguaje de programacin moderno ofrece herramientas para la contruccin de interfaces grficas de usuario (GUI). Java permite al programador:
El diseo y programacin de interfaces grficas de usuario de forma rpida y sencilla. El paquete de clases AWT (Abstract Window Toolkit) El paquete de clases Swing
Swing es una evolucin de AWT, ofreciendo ms clases y una mayor flexibilidad.
Objetivos Entender el diseo de la jerarqua de clases Java que se utilizan para la construccin de GUIs.
Evento
Entender cmo se realiza la gestin de eventos. Aprender a usar un entorno de programacin (Eclipse, Jbuilder, Jdeveloper...) para construir GUIs No es un objetivo: - conocer todos los nombres de clases, interfaces y dems componentes grficos
3
8. Contruccin de interfaces grficos en Java
CONTENEDOR
(los contenedores son componentes)
...
En un Frame, necesitaramos disponer de los mtodos addButton, addCheckBox, addTextField, addFrame,... . Adems, el diagrama no est en absoluto completo, dado que Button puede ser un componente de Panel, o de Dialog, ... y el diseo anterior no lo contempla. Si se quisiera aadir un nuevo componente XXX, deberamos de cambiar la clase Frame y aadir el mtodo addXXX (esta solucin no sera nada extensible) 8. Contruccin de interfaces grficos en Java
8
Comp.Concreto1
CompConcretoN
Contenedor
ContConcreto1
ContConcreto2
Un contenedor est formado por componentes, siend stos componentes concretos o contenedores. A su vez, estos contenedores podran tener distintos componentes, etc.
10
AWT/Swing: contenedores
Frame/JFrame Panel/JPanel Dialog/JDialog el principal
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); } }
Contenedores
Clases Frame/JFrame
Una simple ventana que ofrece iconos para maximizar, minimizar y cerrarla. Se le puede aadir un ttulo. nico contenedor al que se le pueden aadir mens.
Clases Panel/JPanel
Contenedores genricos 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 aade automticamente un Panel. En AWT no.
8. Contruccin de interfaces grficos en Java
Dentro de la clase JFrame se aade un Panel automticamente Al cerrar el JFrame, terminar la aplicacin
11
12
Clases TextArea/JTextArea
Permiten introducir lneas de texto mltiples Se puede usar tambin para mostrar resultados (texto) La clase JTextArea no implementa un scroll automtico. Es necesario aadirlo dentro de un JScrollPane. TextArea, sin embargo, s lo implementa.
Ojo...
13
14
Clases Label/JLabel
Utilizado para mostrar informacin. Se usan junto a los cuadros de texto.
15
16
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. Contruccin de interfaces grficos en Java
17
18
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();
jPanel2
// Crear botones radiales JRadioButton goizez = new JRadioButton("Goizez",true); JRadioButton arratsaldez = new JRadioButton("Arratsaldez",false); // Crear agrupacin de botones ButtonGroup aukeraBotoiMultzoa = new ButtonGroup(); aukeraBotoiMultzoa.add(goizez); aukeraBotoiMultzoa.add(arratsaldez); // Crear lista desplegable y cargarla de datos Vector<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 panel2 jPanel2.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 botn this.setSize(320,200); this.getContentPane().add(BorderLayout.NORTH, jPanel2); this.getContentPane().add(BorderLayout.CENTER,jTextArea1); this.getContentPane().add(BorderLayout.SOUTH, aButton); this.setVisible(true); }
jTextArea1 jButton1
JPanel
19
20
21
22
23
24
26
JMenuItem JMenuItem
27
28
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"); 8. Contruccin de interfaces grficos en 140, Java 160, 30)); jButton2.setBounds(new Rectangle(180, this.getContentPane().add(jButton2, null);
29
30
Gestores de Diseo: Layout Se usan para definir dnde colocar un componente dentro de un contenedor.
edukiontzia.add(osagaia);
Gestores de Diseo: Layout Si se quiere poner el componente en unas coordenadas concretas, se debe de eliminar el gestor de diseo.
osagaia.setLayout(null);
31
32
jPanel1
jPanel2
jPanel3
Panel en BorderLayout.CENTER. Este panel Panel en BorderLayout.SOUTH. ste panel tiene un FlowLayout. tiene un GridLayout(4,3)
8. Contruccin de interfaces grficos en Java
33
34
Gestores de Diseo: Layout Sin gestor de diseo se definen las coordenadas de todos los componentes
fcil 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, jRadioButton2.setText("B"); jRadioButton2.setBounds(new Rectangle(14, jRadioButton3.setText("C"); jRadioButton3.setBounds(new Rectangle(14, jButton1.setText("A1"); jButton1.setBounds(new Rectangle(139, 10, 8. Contruccin de interfaces grficos en Java //... 10, 49, 23)); 40, 58, 23)); 70, 55, 23)); 80, 23));
35
36
37
38
Gestin de Eventos
Al disear un interfaz grfico debemos de tener en cuenta que a consecuencia de las acciones del usuario se generarn distintos eventos. Se deben de programar mtodos para responder a estos eventos provocados por el usuario. Un evento:
es generado por una accin del usuario. est ligado a un componente del GUI. Ejemplos:
pulsar una tecla, mover el ratn, cambiar el tamao de una ventana, cerrarla, minimizarla, pulsar un botn, perder u obtener el foco de un componente, cambiar el valor de un campo de texto, elegir una opcin de men...
8. Contruccin de interfaces grficos en Java
Gestin de Eventos
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(); } } {
39
40
Gestin de Eventos
1
Gestin de Eventos
public void cambiarTexto(){ Queremos saber cundo el usuario pulsa el botn. Al pulsarlo, se generar un evento button.setText(ok! has pulsado el botn); }
2
Si queremos hacer algo cuando se pulse el botn: 1) deberemos de programar un mtodo , para responder al evento que se genera. 2) tendremos que saber cundo se genera el evento.
41
42
<<interface>> ActionListener
Gestin de Eventos
actionPerformed(ActionEvent ev)
Aplicacin
si queremos estar informados sobre los eventos que ocurran en un botn, debemos de implementar un interfaz listener (listener interface)
el usuario me ha pulsado!
43
44
<<interfaze>> ActionListener
<<interfaze>> ActionListener
Gestin de Eventos
actionPerformed(ActionEvent ev)
actionPerformed(ActionEvent ev)
aplicacin
actionPerformed(ActionEvent ev)
botn
registrarse en el botn para or sus eventos
Li
er n s te
actionPerformed(evento)
F Ev uen en t e to de s
46
45
Gestin 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!"); } }
Gestin de Eventos
Siendo un listener: 1) debo de implementar un interfaz 2) para or los eventos del botn, me debo registrar en el botn como listener. 3) para responder a los eventos, debo ofrecer un mtodo .
Como fuente de eventos: 1) debo aceptar el registro de listerners 2) debo admitir acciones de los usuarios 3) al recibir una accin del usuario, debo avisar del evento a mis listeners
Ey! Y yo qu?
evento
47
48
Gestin de Eventos
Gestin de Eventos
import import import import import java.awt.BorderLayout; java.awt.FlowLayout; java.awt.event.ActionEvent; java.awt.event.ActionListener; javax.swing.*; 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); } }
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 actionPerformed(ActionEvent e) { button.setText("botoia sakatu duzu!"); if ( (e.getModifiers() & ActionEvent.SHIFT_MASK) != 0) button.setText(button.getText() + " baita Shift tekla ere!"); }
49
50
Gestin 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()); } }
Un componente grfico puede aceptar el registro de objetos observadores (listeners) que implementen el interfaz adecuado
addXXXListener() - Por ejemplo: addActionListener(ActionListener observador) addItemListener(ItemListener observador)
51
Algunos observadores (listeners) disponen de numerosos mtodos, siendo probable que no necesitemos usar todos (dado que no queremos responder a todo posible evento) Java, no obstante, obliga a implementar todos los mtodos de un interfaz Para evitar esa situacin (usar slo un mtodo de un interfaz, pero tener que programarlos todos), Java ofrece clases Adapter.
8. Contruccin de interfaces grficos en Java
Una clase Adapter implementa todos los mtodos de un interfaz, dejndolos con un cuerpo vaco. Ejemplo: si slo quiero gestionar el cierre de una ventana:
myframe.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent winEvt) { System.exit(0); } } );