TEMA 1. Diseño de interfaces gráficas

Download Report

Transcript TEMA 1. Diseño de interfaces gráficas

TEMA 1.
Diseño de interfaces gráficas
1.
2.
3.
4.
5.
6.
Introducción
Componentes de la interfaz
Programación dirigida por eventos
Gestores de ubicación
Primitivas gráficas de pantalla.
Diseño de interfaces gráficas de usuario
1
Bibliografía



http://java.sun.com/docs/books/tutorial/u
iswing/
Kathy Walrath, et all. “The JFC Swing
Tutorial”. Ed. Addison Wesley. 2004.
http://www.programacion.com/java/tutori
al/swing/
2
2 . Programación dirigida por eventos
Eventos



Todas las clases relativas a eventos son subclases de
java.util.EventObject. La biblioteca java.awt.event y
java.swing.event contienen todos los eventos.
Todo evento posee un objeto fuente (getSource()). Además,
cada clase de evento posee una serie de métodos adecuados
para todos los tipos de eventos que define (getX() y getY()).
Sobre una componente se puede lanzar un evento. Cada tipo
de evento es una clase distinta. Cuando el evento se lanza
es recibido por uno o más de un "listener" que actúa sobre
ese evento.
3
2 . Programación dirigida por eventos
Eventos



Debemos crear un objeto Listener y registrarlo en la
componente sobre la que se lanza el evento con
addXXXListener(), donde XXX es el tipo de evento
que escucha. Toda la lógica del tratamiento debe ir
en la clase listener.
Si a un botón le añadimos addActionListener()
estamos indicando que método se debe activar
cuando el botón es pulsado.
ActionListener es una interface que sólo tiene un
método actionPerformed() significando "esta es la
acción que será llevada a cabo cuando se lanza un
evento". actionPerformed()

NO recibe un evento genérico, sino un tipo específico:
ActionEvent.
4
2 . Programación dirigida por eventos
Eventos
Evento->Interface del Listener->
KeyEvent
|
KeyListener
métodos add & remove
addKeyListener() &
removeKeyListener()
5
2 . Programación dirigida por eventos
Eventos

Si trabajamos con una componente y
sabemos los eventos que es capaz de
recibir, los pasos a seguir serían los
siguientes:
– Tomamos el nombre del evento, le quitamos la
palabra "Event" y la cambiamos por
"Listener".
– Implementamos el interface anterior
escribiendo el código correspondiente para
cada uno de los métodos de la interface.
– Creamos un objeto de la clase listener del
paso anterior y la registramos en nuestras
6
componentes.
2 . Programación dirigida por eventos
Eventos generales

Component
–

Focus
–

Notifica a los oyentes las pulsaciones de teclas; sólo generado
por el componente que tiene el foco del teclado.
Mouse
–

Notifica a los oyentes que el componente a ganado o perdido
la posibilidad de recibir entrada desde el teclado.
Key
–

Notifica a los oyentes cambios en el tamaño, posición o
visibilidad del componente.
Notifica a los oyentes las pulsaciones del ratón y los
movimientos de entrada y salida del usuario en el área de
dibujo del componente.
Mouse Motion
–
Notifica a los oyentes cambios en la posición del cursor sobre
el componente.
7
2 . Programación dirigida por eventos
Eventos
8
2 . Programación dirigida por eventos
Eventos
Event, listener interface y addand remove-metodos
Componentes que soportan
ese evento
ActionEvent
ActionListener
addActionListener( )
removeActionListener( )
JButton, JList, JTextField,
JMenuItem y sus derivadas
incluidas JCheckBoxMenuItem,
JMenu, and JpopupMenu.
AdjustmentEvent
AdjustmentListener
addAdjustmentListener( )
removeAdjustmentListener( )
JScrollbar
y cualquiera que implemente las
interfaces Adjustable interface.
ComponentEvent
ComponentListener
addComponentListener( )
removeComponentListener( )
*Component y sus derivadas
incluidas JButton,, JCheckBox,
JComboBox, Container,
JPanel, JApplet, JScrollPane,
Window, JDialog, JFileDialog,
JFrame, JLabel, JList,
JScrollbar, JTextArea, and
JTextField.
ContainerEvent
ContainerListener
addContainerListener( )
removeContainerListener( )
Container y sus derivadas
incluidas JPanel, JApplet,
JScrollPane, Window,
JDialog, JFileDialog, yJFrame.
FocusEvent
FocusListener
addFocusListener( )
removeFocusListener( )
Component y derivadas*.
KeyEvent
KeyListener
addKeyListener( )
removeKeyListener( )
Component y derivadas*.
MouseEvent (tanto para clicks y
movimiento )
Component y derivadas*.
9
addContainerListener( )
removeContainerListener( )
JScrollPane, Window,
JDialog, JFileDialog, yJFrame.
FocusEvent
FocusListener
addFocusListener( )
removeFocusListener( )
Component y derivadas*.
KeyEvent
KeyListener
addKeyListener( )
removeKeyListener( )
Component y derivadas*.
MouseEvent (tanto para clicks y
movimiento )
MouseListener
addMouseListener( )
removeMouseListener( )
Component y derivadas*.
MouseEvent (tanto para clicks y
movimiento)
MouseMotionListener
addMouseMotionListener( )
removeMouseMotionListener( )
Component y derivatives*.
WindowEvent
WindowListener
addWindowListener( )
removeWindowListener( )
Window y sus derivadas incluidas
JDialog, JFileDialog, and
JFrame.
ItemEvent
ItemListener
addItemListener( )
removeItemListener( )
JCheckBox,
JCheckBoxMenuItem,
JComboBox, JList, y cualquiera
que implemente la interfaz
ItemSelectable
TextEvent
TextListener
addTextListener( )
removeTextListener( )
Cualquier derivada de
JTextComponent, incluidas
JTextArea y JTextField.
2 . Programación dirigida por eventos
Eventos
10
2 . Programación dirigida por eventos
Adaptadores



Hay casos en los que la interface sólo tiene
un método, con lo que la implementación es
sencilla. Pero hay otros en el que podemos
tener hasta 7 métodos que habría que
reescribir de los que sólo nos interesan unos
pocos.
Para evitar este problema cada una de la
interfaces de los Listeners que tienen más
de un método tienen un "adapter" que
implementa completamente la interface.
Por ejemplo: MouseAdapter (para
MouseListener), WindowAdapter (para
WindowListener), etc...
11
2 . Programación dirigida por eventos
Adaptadores
class p implements WindowListener {
.....
public void windowIconified(WindowEvent e) { ... sentencias...}
// para los restantes eventos no hacemos nada
public void windowActivated(WindowEvent e) {;}
public void windowClosed(WindowEvent e) {;}
public void windowClosing(WindowEvent e) {;}
public void windowDeactivated(WindowEvent e) {;}
public void windowDeiconified(WindowEvent e) {;}
public void windowOpened(WindowEvent e) {;}
}
class p extends WindowAdapter {
.....
public void windowIconified(WindowEvent e) { ... sentencias ...}
// para los restantes eventos no hay que hacer nada.
// El comportamiento deseado se hereda del adaptador = no
hacer nada
}
12
2 . Programación dirigida por eventos
Oyentes
Listener interface
w/ adapter
Métodos en la interfaz
ActionListener
actionPerformed(ActionEvent)
AdjustmentListener
adjustmentValueChanged(
AdjustmentEvent)
ComponentListener
ComponentAdapter
componentHidden(ComponentEvent)
componentShown(ComponentEvent)
componentMoved(ComponentEvent)
componentResized(ComponentEvent)
ContainerListener
ContainerAdapter
componentAdded(ContainerEvent)
componentRemoved(ContainerEvent)
FocusListener
FocusAdapter
focusGained(FocusEvent)
focusLost(FocusEvent)
KeyListener
KeyAdapter
keyPressed(KeyEvent)
keyReleased(KeyEvent)
keyTyped(KeyEvent)
MouseListener
MouseAdapter
mouseClicked(MouseEvent)
mouseEntered(MouseEvent)
mouseExited(MouseEvent)
mousePressed(MouseEvent)
mouseReleased(MouseEvent)
MouseMotionListener
MouseMotionAdapter
mouseDragged(MouseEvent)
mouseMoved(MouseEvent)
WindowListener
WindowAdapter
windowOpened(WindowEvent)
windowClosing(WindowEvent)
windowClosed(WindowEvent)
windowActivated(WindowEvent)
windowDeactivated(WindowEvent)
windowIconified(WindowEvent)
windowDeiconified(WindowEvent)
ItemListener
itemStateChanged(ItemEvent)
TextListener
TextValueChanged(TextEvent)
13
2 . Programación dirigida por eventos
Eventos

Existen diferentes métodos para definir los
oyentes de los métodos:
–
–
–
–
Como clases internas dentro de la definición de las
clases componentes.
Como clases independientes, estableciendo algún
mecanismo para identificar la componente sobre la que
se produce el evento.
Directamente sobre la clase que extiende a la
componente indicando que implemente la
correspondiente interfaz
Como clases anónimas.

14
2 . Programación dirigida por eventos
Eventos

Clase interna
Class ComponenteIGU extends JPanel
Button boton;
ComponenteIGU(){
boton= new Button(“ejemplo”);
add(boton);
OyenteBoton oy= new OyenteBoton();
boton.addActionListener(oy); …}
// Definición de la clase interna
class OyenteBoton implements ActionListener
public actionPerformer(ActionEvent e){
boton…..}
15
2 . Programación dirigida por eventos
Eventos

Clase externa
class OyenteBoton implements ActionListener
public actionPerformer(ActionEvent e){
problema al tratar de referenciar el boton
e.getSource()
boton…..}
16
2 . Programación dirigida por eventos
Eventos

Extendiendo la clase para que tenga también
la función de oyente.
Class ComponenteIGU extends JPanel implements
ActionListener
Button boton;
ComponenteIGU(){
boton= new Button(“ejemplo”);
add(boton);
boton.addActionListener(this); …}
public actionPerformer(ActionEvent e){
boton…..}
17
2 . Programación dirigida por eventos
Eventos

Como clase anónima
Class ComponenteIGU extends Jpanel implements
ActionListener
Button boton;
ComponenteIGU(){
boton= new Button(“ejemplo”);
add(boton);
boton.addActionListener( new ActionListener
{
public actionPerformer(ActionEvent e){
18
boton…..}})