La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

Curs Programació Java: Sessió 6

Presentaciones similares


Presentación del tema: "Curs Programació Java: Sessió 6"— Transcripción de la presentación:

1 Curs Programació Java: Sessió 6
Gestió d'Esdeveniments a Interfícies Gràfiques d'Usuari amb AWT i SWING

2 Gestió d'Esdeveniments
Esdeveniment: prémer una tecla o botó, ... Un objecte es notificat de l'esdeveniment si: Implementa la interfície apropiada Es registrat com a Listener del esdeveniment *Event: Obj. representant del esdeveniment que ofereix informació d'ell i identifica l'origen. Origen: habitualment son components. Un origen pot tenir diversos Listeners, i un Listener pot tenir diversos orígens.

3 Exemples d'Esdeveniments

4 Implementar Gestor d'Esdeveniments
Requisits d'un gestor d'esdeveniments: Declaració: la classe implementa, o hereta, una interfície de Listener. public class MyClass implements ActionListener { Registrar un objecte de la classe Listener a un o més components. someComponent.addActionListener(instanceMyClass); Implementació dels mètodes de la interfície Listener public void actionPerformed(ActionEvent e) { ...//codi que reacciona a l'esdeveniment... }

5 Gestió d'Esdeveniment amb JButton
Implementa interfície ActionListener. Registrar Listener addActionListener. Prem el botó de la pantalla, dispara l'esdeveniment action, que crida al mètode actionPerformed, únic mètode de la interficie ActionListener amb un objecte ActionEvent com a parametre

6 Gestió d'Esdeveniments i Threads
Els esdeveniments s'executen consecutivament, gràcies a un thread de despatxa esdeveniments. Mentre s'executa el métode actionPerformed el GUI del programa es congela, per tant si les accions que es realitzen dins d'ell son pesades s'han d'executar dins d'un thread.

7 La classe AWTEvent Els mètodes d'un Listener tenen un únic paràmetre, descendent de la classe java.awt.AWTEvent. Mètode heretat de java.util.EventObject: Object getSource() : retorna l'objecte que va generar l'esdeveniment. A les subclasses es defineixen mètodes similars restringint el tipus de retorno. Ex: classe ComponentEvent mètode Component getComponent(): retorna el Component que va generar l'esdeveniment.

8 Jerarquia de AWTEvent

9 Esdeveniments Estandard del AWT
El AWT defineix una dotzena de tipus de Listener. Es pot saber els tipus d'esdeveniments que pot generar un component mitjançant els Listeners que pot registrar. Ex: classe Component defineix els mètodes de registre: addComponentListener, addFocusListener, addKeyListener, addMouseListener i addMouseMotionListener; per tant tota subclasse de Component suporta listeners de focus, key, mouse i mouse- motion.

10 Adaptadors i Classes Internes
Reduir la sobrecarrega del codi, ja que les interficies de Listener poden contenir mètodes que no necessitem. Ex: MouseListener conté cinc métodes: mousePressed, mouseReleased, mouseEntered, mouseExited, i mouseClicked. Encará que només volem pulsacions, hem d'implementar la resta amb el cos buit.

11 Adaptadors i Classes Internes (II)
Per evitar l'efecte de mètodes buits, el AWT i Swing proporcionen una classe adapter per cada interfície de Listener. Ex: la classe MouseAdapter implementa la interfície MouseListener. Una classe adaptador implementa tots els mètodes de la interfície buits.

12 No implementar la interfície Listener.
Ús d'un Adaptador No implementar la interfície Listener. Crear una subclasse del adaptador: Ex: estenent la classe MouseAdapter. public class MyClass extends MouseAdapter { ... someObject.addMouseListener(this); public void mouseClicked(MouseEvent e) { // Implementació del esdeveniment... }

13 Si la classe no pot heretar d'un adaptador.
Classes Internes Si la classe no pot heretar d'un adaptador. Ex: Applet que gestiona esdev. de ratolí Java no permet herència múltiple, la classe no pot ser filla de Applet i MouseAdapter. Solució: definir classe interna filla de adapter public class MyClass extends Applet { ... someObject.addMouseListener(new MyAdapter()); class MyAdapter extends MouseAdapter { public void mouseClicked(MouseEvent e) { // Implementació d'esdeveniment... }

14 Esdeveniments Components Swing
Els components Swing pot generar els esdeveniments: Component: Notifica als listeners canvis a la mida, posició o visibilitat del component. Focus: Notifica als listeners que el component a obtingut o perdut la possibilitat de rebre una entrada des del teclat. Key: Notifica als listeners pulsacions de tecles. Mouse: Notifica als listeners les pulsacions del ratolí i els moviments d'entrada/sortida del usuari en l'àrea de dibuix del component. MouseMotion: Notifica als listeners canvis a la posició del cursor damunt el component.

15 Esdeveniments comuns

16 Esdeveniments comuns: notes
Item i Window es un esdeveniment definit al AWT, la resta estan definits en Swing. No són subclasse de Jcomponent les components: ColorSelectionModel Document ListSelectionModel Timer

17 Esdeveniments menys comuns
Ancestor: Quan un dels seus contenidors s'afegeix o s'elimina d'un contenidor, s'amaga, es visualitza o es mou. Property Change: per compatibilitat amb JavaBeans per a propietats compartides. Vetoable Change: per compatibilitat amb JavaBeans per a propietats restringides. Altres esdeveniments:

18 Listeners Grups d'esdeveniments per cada listener

19 Listeners (II) MouseInputAdapter: Implementa les interfícies MouseListener i MouseMotionListener.

20 Tipus d'Esdeveniments de baix nivell: Esdeveniments de ratolí i teclat. Esdeveniments component, container, focus, i window. Semàntics: Esdeveniments action, change, document i item.

21 La interfície ActionListener
Quan un usuari prem un button, un menu item o Return en un text field es llença un esdeveniment action, que envia un missatge al metode void actionPerformed (ActionEvent) a tots els actionListeners registrats al component. public class Beeper ... implements ActionListener { ...: button.addActionListener(this); ... public void actionPerformed(ActionEvent e) { Toolkit.getDefaultToolkit().beep(); }

22 Dos mètodes molt útils:
La classe ActionEvent Dos mètodes molt útils: String getActionCommand(): Retorna el string associat amb l'acció. Pot ser assignat mitjançant el mètode setActionCommand, pot ser el text mostrat al component o el nom d'un ítem seleccionat. int getModifiers(): Retorna un enter que representa les tecles modificadores premudes. Permet les constants: SHIFT_MASK, CTRL_MASK, META_MASK, i ALT_MASK. actionEvent.getModifiers() & ActionEvent.SHIFT_MASK

23 La interfície KeyListener
Generat pel component que té el focus del teclat quan l'usuari prem o llibera les tecles. Dos tipus básics de KeyEvent la pulsació d'un caracter Unicode (key-typed), i la pulsació o liberació d'una tecla (key-pressed o key-released). Mètodes: void keyTyped(KeyEvent): Després que es premi un caracter Unicode. void keyPressed(KeyEvent): Després que es premi una tecla. void keyReleased(KeyEvent): Després que es lliberi una tecla.

24 Exemple de KeyListener
public class KeyEventDemo ... implements KeyListener ... { ... typingArea = new JTextField(20); typingArea.addKeyListener(this); public void keyTyped(KeyEvent e) {displayI(e, "KEY TYPED: ");} public void keyPressed(KeyEvent e){displayI(e,"KEY PRESSED:");} public void keyReleased(KeyEvent e){displayI(e,"KEY RELEASED: ");} ... protected void displayI(KeyEvent e, String s){ char c = e.getKeyChar(); int keyCode = e.getKeyCode(); int modifiers = e.getModifiers(); tmpString = KeyEvent.getKeyModifiersText(modifiers); ...//mostrar informació del KeyEvent... }

25 La classe KeyEvent int getKeyChar(), void setKeyChar(char): Obté o selecciona el caracter Unicode associat. int getKeyCode(), void setKeyCode(int): Obté o selecciona el codi de tecla associat. void setModifiers(int): Selecciona l'estat de les tecles modificadores. String getKeyText(), String getKeyModifiersText(): Retorna una descripció del codi de tecla i de la tecla modificadora. Mètodes heretats: Component getComponent(), void consume(), int getWhen(), boolean isAltDown(), boolean isControlDown(), boolean isMetaDown(), boolean isShiftDown() i int getModifiers()

26 La interfície MouseListener
Quan l'usuari usa el ratolí, entrant o sortint d'un component amb el cursor a l'àrea de pantalla o pulsant o alliberant els botóns. void mouseClicked(MouseEvent): desprésque l'usuari premi el component. void mouseEntered(MouseEvent): desprésque el curso entri al component. void mouseExited(MouseEvent): desprésque el cursor surti del component.

27 MouseListener: més mètodes
void mousePressed(MouseEvent): desprésde premer el botó del ratoli damunt un component. void mouseReleased(MouseEvent): desprésde lliberar el botó del ratoli damunt un component. Quan l'usuario arrastra, el component damunt el qual es trobaba al començar a arrastrar es el que rep tots els esdeveniments de mouse i mouse- motion.

28 La classe MouseEvent Mètodes:
int getClickCount(): Retorna el nombre de clicks. int getX(), int getY(), Point getPoint(): Retorna la posició (x,y) relativa al component on es produeix l'esdeveniment. boolean isPopupTrigger(): Retorna true si l'esdeveniment a de mostrar un menú popup. Hereta: Component getComponent(): Retorna el componente que va generar l'esdeveniment. void consume(): Fa que el pare descartí l'esdeveniment. int getWhen(): Retorna el moment en que succeeix l'esdeveniment.

29 La classe MouseEvent (II)
boolean isAltDown(), boolean isControlDown(), boolean isMetaDown(), boolean isShiftDown(): Retorna l'estat individual de les tecles modificadores en el moment que es va generar l'esdeveniment. int getModifiers(): Retorna l'estat de totes les tecles modificadores i botons del ratolí quan es va generar l'esdeveniment. Màscares a InputEvent: CTRL_MASK, ALT_MASK, SHIFT_MASK, BUTTON1_MASK, BUTTON2__MASK, BUTTON3_MASK i META_MASK. SwingUtilities: mètodes pel botons del ratolí. static boolean isLeftMouseButton(MouseEvent) static boolean isMiddleMouseButton(MouseEvent) static boolean isLEFTMouseButton(MouseEvent)

30 La interfície Mouse-MotionListener
Quan l'usuari usa el ratolí per moure el cursor damunt la pantalla. void mouseDragged(MouseEvent): Resposta a un moviment del ratolí per part de l'usuari mentre manté pulsat un dels botons. void mouseMoved(MouseEvent): Respostaa un moviment del ratolí per part de l'usuari amb cap butó premut. Els esdeveniments son de tipus MouseEvent, NO Mouse-MotionEvent

31 Exemple de Mouse-MotionListener
...//inicialització: MyListener myListener = new MyListener(); addMouseListener(myListener); addMouseMotionListener(myListener); ... class MyListener extends MouseAdapter implements MouseMotionListener { public void mousePressed(MouseEvent e) { int x = e.getX(); int y = e.getY(); currentRect = new Rectangle(x, y, 0, 0); repaint(); } public void mouseDragged(MouseEvent e) { updateSize(e); } public void mouseMoved(MouseEvent e) { //No fem rés. } public void mouseReleased(MouseEvent e) { updateSize(e); } void updateSize(MouseEvent e) { int x = e.getX(); int y = e.getY(); currentRect.setSize(x - currentRect.x,y - currentRect.y); repaint();

32 La interfície ComponentListener
Quan s'amaga, es mostra, es mou o redimensiona. Mètodes: void componentHidden(ComponentEvent): després d'ocultar el component. void componentMoved(ComponentEvent): quan el component es mou en relació al contenidor. void componentResized(ComponentEvent): després de canviar la mida del component. void componentShown(ComponentEvent): després de mostrar el component

33 Exemple ComponentListener
public class ComponentEventDemo ... implements ComponentListener { ... //where initialization occurs: aFrame = new JFrame("A Frame"); ComponentPanel p = new ComponentPanel(this); aFrame.addComponentListener(this); p.addComponentListener(this); public void componentHidden(ComponentEvent e) { displayMessage("componentHidden event from " + e.getComponent().getClass().getName()); } public void componentMoved(ComponentEvent e) { displayMessage("componentMoved event from "

34 Exemple ComponentListener (II)
public void componentResized(ComponentEvent e) { displayMessage("componentResized event from " + e.getComponent().getClass().getName()); } public void componentShown(ComponentEvent e) { displayMessage("componentShown event from " class ComponentPanel extends JPanel ... { ... ComponentPanel(ComponentEventDemo listener) { ...//after creating the label and checkbox: label.addComponentListener(listener); checkbox.addComponentListener(listener);

35 La classe ComponentEvent
Component getComponent(): Retorna el component que va generar l'esdeveniment. Es pot usar enlloc del mètode getSource.

36 La interfície ContainerListener
Després d'afegir o eliminar un component a un container. Dos métodes: void componentAdded(ContainerEvent): desprésd'afegir un component al contenidor. void componentRemoved(ContainerEvent): desprésd'eliminar un compoenet del contenidor.

37 Exemple de ContainerListener
public class ContainerEventDemo ... implements ContainerListener ... { ... //where initialization occurs: buttonPanel = new JPanel(); buttonPanel.addContainerListener(this); public void componentAdded(ContainerEvent e) { displayMessage(" added to ", e); } public void componentRemoved(ContainerEvent e) { displayMessage(" removed from ", e); void displayMessage(String action, ContainerEvent e) { display.append(((JButton)e.getChild()).getText() + " was" + action + e.getContainer().getClass().getName() + newline); ...

38 La classe ContainerEvent
Dos mètodes útils: Component getChild(): Retorna el component afegit o eliminat. Container getContainer(): Retorna el contenidor que va genera l'esdeveniment.

39 La interfície WindowListener
Generat per una finestra després de ser oberta, tancada, iconificada, desiconificada, activada o desactivada. Quan s'iconifica una finestra, s'aturen els threads i es lliberen recursos, al desiconificar-la, s'arrenquen de nou.

40 La interfície WindowListener: mètodes
void windowOpened(WindowEvent): desprésde mostrar la finestra per primer cop. void windowClosing(WindowEvent): Resposta a la petició de tancament de la finestra. void windowClosed(WindowEvent): desprésde tancar la finestra. void windowIconified(WindowEvent), void windowDeiconified(WindowEvent): Després d'iconificar o desiconificar la finestra. void windowActivated(WindowEvent), void windowDeactivated(WindowEvent): Després d'activar o desactivar la finestra.

41 Exemple de WindowListener
public class WindowEventDemo ... implements WindowListener { window = new JFrame("Window Event Window"); window.addWindowListener(this); window.getContentPane().add(new JLabel("The applet listens to this window for window events."),BorderLayout.CENTER); window.pack();} public void windowClosing(WindowEvent e){window.setVisible(false); msg("Window closing", e); } public void windowClosed(WindowEvent e){msg("Tancada", e);} public void windowOpened(WindowEvent e){msg("Oberta",e);} public void windowIconified(WindowEvent e){msg("Iconificada",e);} public void windowDeiconified(WindowEvent e){msg("Desiconificada",e);} public void windowActivated(WindowEvent e) {msg("Activada", e); } public void windowDeactivated(WindowEvent e){msg("Desactivada",e);} void displayMessage(String prefix, WindowEvent e) { display.append(prefix+": "+e.getWindow()+newline); } ... }

42 La classe WindowEvent Window getWindow(): Retorna la finestra que va generar l'esdeveniment.

43 La interfície ItemListener
Provocats per components ItemSelectable, que mantenen l'estat. Poden ser checkboxes, checkbox menu item i comboboxes. public void itemStateChanged(ItemEvent e) { if (e.getStateChange() == ItemEvent.SELECTED) { label.setVisible(true); } else { label.setVisible(false); }

44 La classe ItemEvent Mètodes: Object getItem(): Retorna el component específic associat amb l'ítem. ItemSelectable getItemSelectable(): Retorna el component que va generar l'esdeveniment. int getStateChange(): Retorna el nou estat de l'ítem Estats: SELECTED; i DESELECTED.

45 La interfície de ListSelectionListener
Quan una selecció a una list o table canvia. El listener es poden registrar amb el objecte selection model apropiat o la classe JList. ...//definició de variables membre JList list; JTable table; ...//al mètode init: listSelectionModel = list.getSelectionModel(); listSelectionModel.addListSelectionListener( new SharedListSelectionHandler()); ... table.setSelectionModel(listSelectionModel); void valueChanged(ListSelectionEvent)

46 Exemple de ListSelectionListener
class SharedListSelectionHandler implements ListSelectionListener { public void valueChanged(ListSelectionEvent e) { ListSelectionModel lsm = (ListSelectionModel)e.getSource(); int firstIndex = e.getFirstIndex(); int lastIndex = e.getLastIndex(); boolean isAdjusting = e.getValueIsAdjusting(); output.append("Esdv per indexs "+firstIndex+" - "+lastIndex+"; isAdjusting is "+isAdjusting+"; index seleccionat:"); if (lsm.isSelectionEmpty()) { output.append(" <none>"); } else { // Trobar el indexs seleccionats. int minIndex = lsm.getMinSelectionIndex(); int maxIndex = lsm.getMaxSelectionIndex(); for (int i = minIndex; i <= maxIndex; i++) if (lsm.isSelectedIndex(i)) output.append(" " + i); } output.append(newline); } }

47 La classe ListSelectionEvent
Mètodes: int getFirstIndex(): Retorna l'index del primer ítem canviat. int getLastIndex(): Retorna l'index de l'últim ítem canviat. int getValueIsAdjusting(): Retorna true si encarà s'està modificant la selecció. Hereta el mètode getSource per obtenir l'origen de l'esdeveniment.

48 La interfície FocusListener
Els components que tenen el focus poden rebre les pulsacions del teclat. Es genera quan un component guanya o perd el focus del teclat. requestFocus de Component: donar el focus a un component específic. Mètodes: void focusGained(FocusEvent): després que el component obtingui el focus. void focusLost(FocusEvent): després que el component perdi el focus.

49 Exemple de FocusListener
public class FocusEventDemo ... implements FocusListener ... { ./inicialització window = new FocusWindow(this); public void focusGained(FocusEvent e) { displayMessage("Focus guanyat", e); } public void focusLost(FocusEvent e) { displayMessage("Focus perdut", e); void displayMessage(String prefix, FocusEvent e) { display.append(prefix + ": " + e.getComponent() + newline); ...

50 Exemple de FocusListener (II)
class FocusWindow extends JFrame { ... public FocusWindow(FocusListener listener) { super("Focus Demo Window"); this.addFocusListener(listener); JLabel label = new JLabel("A Label"); label.addFocusListener(listener); JComboBox choice = new JComboBox(/* list of items */); choice.addFocusListener(listener); JButton button = new JButton("A Button"); button.addFocusListener(listener); JList list = new JList(/* list of items */); list.addFocusListener(listener); }

51 La classe FocusEvent boolean isTemporary(): Retorna true si es perd el focus temporalment.

52 La interfície CaretListener
Quan dins d'un component de text es mou el cursor o canvia la selecció. Es pot afegir a les subclasses de JTextComponent amb el mètode addCaretListener. Mètode: void caretUpdate(CaretEvent)

53 La classe CaretEvent Dos mètodes molt útils: int getDot(): Retorna la posició actual del cursor. Si hi ha text seleccionat, el cursor marca un dels extrems de la selecció. int getMark(): Retorna l'altre extrem de la selecció. Si no hi ha rés seleccionat es igual al getDot.

54 La interfície ChangeListener
Quan canvia l'estat d'un component. void stateChanged(ChangeEvent) class SliderListener implements ChangeListener { public void stateChanged(ChangeEvent e) { JSlider source = (JSlider)e.getSource(); if (!source.getValueIsAdjusting()) { int fps = (int)((JSlider)e.getSource()).getValue(); if (fps == 0) { if (!frozen) stopAnimation(); } else { delay = 1000 / fps; timer.setDelay(delay); if (frozen) startAnimation(); }

55 La classe ChangeEvent No defineix mètodes propis. Hereta el mètode getSource de la classe EventObject

56 La interfície DocumentListener
Quan el contingut de un document es modifica. El listener s'afegeix al document, no al propi component. Métodes: void changedUpdate(DocumentEvent): quan es modifica l'estil o el texte a un StyledDocument, mai a un PlainDocument. void insertUpdate(DocumentEvent): quan s'inserta text al document. void removeUpdate(DocumentEvent): quan s'elimina text al document.

57 La classe DocumentEvent
No descendeix de EventObject. Mètodes: Document getDocument(): Retorna el document que va generar l'esdeveniment. int getLength(): Retorna la longitud del canvi. int getOffset(): Retorna la posició dins del document del primer caràcter modificat. ElementChange getChange(Element): Retorna detalls dels elements del document que han canviat i com ho han fet. EventType getType(): Retorna el tipus de canvi que s'ha esdevingut (inserir i eliminar text i canviar l'estil).

58 La interfície InternalFrameListener
Notifiquen quan es mostra por primer cop, s'elimina, iconifica, maximitza, activa o desactiva.

59 Mètodes de InternalFrameListener
void internalFrameOpened(InternalFrameEvent): Després que es mostri per primer cop. void internalFrameClosing(InternalFrameEvent): Resposta a una petició de tancar. Es pot customitzar el tancat amb el mètode setDefaultCloseOperation. void internalFrameClosed(InternalFrameEvent): Després de tancar el internal frame. void internalFrameIconified(InternalFrameEvent), void internalFrameDeiconified(InternalFrameEvent) Després de iconificar-ho o maximizar-ho. void internalFrameActivated(InternalFrameEvent), void internalFrameDeactivated(InternalFrameEvent) Després d'activar-ho o desactivar-ho.

60 Exemple de InternalFrameListener
public class InternalFrameEventDemo ... implements InternalFrameListener ...{ ... protected void createListenedToWindow() { listenedToWindow=new JInternalFrame("Event Generator",true, true, true,true); listenedToWindow.setDefaultCloseOperation( WindowConstants.DISPOSE_ON_CLOSE); } public void internalFrameClosing(InternalFrameEvent e) { displayMessage("Internal frame closing", e); } public void internalFrameClosed(InternalFrameEvent e) { displayMessage("Internal frame closed", e); listenedToWindow = null; } public void internalFrameOpened(InternalFrameEvent e) { displayMessage("Internal frame opened", e); } public void internalFrameIconified(InternalFrameEvent e) { displayMessage("Internal frame iconified", e); } public void internalFrameDeiconified(InternalFrameEvent e) { displayMessage("Internal frame deiconified", e); } public void internalFrameActivated(InternalFrameEvent e) { displayMessage("Internal frame activated", e); }

61 Exemple de InternalFrameListener (II)
public void internalFrameDeactivated(InternalFrameEvent e) { displayMessage("Internal frame deactivated", e); } void displayMessage(String prefix, InternalFrameEvent e) { String s = prefix + ": " + e.getSource(); display.append(s + newline); } public void actionPerformed(ActionEvent e) { if (e.getActionCommand().equals(SHOW)) { if (listenedToWindow == null) { createListenedToWindow(); listenedToWindow.addInternalFrameListener(this); }

62 La classe InternalFrameEvent
No defineix mètodes propis. Hereta el mètode getSource de la classe EventObject.

63 La interfície UndoableEditListener
Quan succeeix una operació reversible. void undoableEditHappened(UndoableEditEvent)

64 La classe UndoableEditEvent
UndoableEdit getEdit(): Retorna un objecte UndoableEdit que representa la edició succeeida i conté informació de les accions desfer o repetir la edició.


Descargar ppt "Curs Programació Java: Sessió 6"

Presentaciones similares


Anuncios Google