12
(/(& (QJLQHHULQJ6RIWZDUH6WUXFWXUHV :HHN6RIWZDUH $UFKLWHFWXUH /HFWXUH ([DPSOHV ] 3LSHVDQG)LOWHUV ] /D\HUV ] (YHQW%DVHG ] ’DWD&HQWHUHG ] ,QWHUSUHWHU ] 3$& (YHQW’ULYHQ$UFKLWHFWXUH 6W\OH ] 6RXUFHVHQGVPHVVDJH HYHQWWRWDUJHW ] 7DUJHWFDQEHRUPRUH FRPSRQHQWVDWWDFKHGWR HYHQWFRQQHFWRU ] 6RXUFHKDVQRGLUHFW NQRZOHGJHRIWDUJHWRQO\ KDVNQRZOHGJHRI FRQQHFWRU E E Event Unicast Event Multicast Source Target Source Target Target ([DPSOH*UDSKLFDO8VHU ,QWHUIDFH*8,&RPSRQHQWV ] *UDSKLFDOXVHULQWHUIDFHVDUH FRPSRVHGRIDVHWRISULPLWLYH FRPSRQHQWVRUZLGJHWV ] 7KHVHZLGJHWVVKRXOGEH FXVWRPL]DEOHDQGUHXVDEOHLQDQ\ FRQWH[WQRWKDQGFRGHGIRUHYHU\ DSSOLFDWLRQ ] 7KHUHIRUHVKRXOGQRWKDYH NQRZOHGJHRIWKHDUFKLWHFWXUHLQ ZKLFKWKH\DUHSODFHG Button Dialogue Box

(/(& ˆ ([DPSOHV (QJLQHHULQJ6RIWZDUH6WUXFWXUHV · ,PSOHPHQWLQJ(YHQW &RQQHFWRU // Target implements this method. It is called by the // event connector whenever a new event is fired

  • Upload
    others

  • View
    3

  • Download
    0

Embed Size (px)

Citation preview

Page 1: (/(& ˆ ([DPSOHV (QJLQHHULQJ6RIWZDUH6WUXFWXUHV · ,PSOHPHQWLQJ(YHQW &RQQHFWRU // Target implements this method. It is called by the // event connector whenever a new event is fired

(/(&����

(QJLQHHULQJ�6RIWZDUH�6WUXFWXUHV

:HHN����6RIWZDUH

$UFKLWHFWXUH

/HFWXUH��

([DPSOHV�>6KDZ*DUODQ@

] 3LSHV�DQG�)LOWHUV

] /D\HUV

] (YHQW�%DVHG

] 'DWD�&HQWHUHG

] ,QWHUSUHWHU

] 3$&

(YHQW�'ULYHQ�$UFKLWHFWXUH

6W\OH

] 6RXUFH�VHQGV�PHVVDJH�HYHQW��WR�WDUJHW

] 7DUJHW�FDQ�EH���RU�PRUHFRPSRQHQWV�DWWDFKHG�WRHYHQW�FRQQHFWRU

] 6RXUFH�KDV�QR�GLUHFWNQRZOHGJH�RI�WDUJHW��RQO\KDV�NQRZOHGJH�RIFRQQHFWRU

\ 7KHUHIRUH WDUJHWV FDQ

FKDQJH VWDWLFDOO\ RU

G\QDPLFDOO\

E

E

Event Unicast

Event Multicast

Source Target

Source

Target

Target

([DPSOH��*UDSKLFDO�8VHU

,QWHUIDFH��*8,��&RPSRQHQWV

] *UDSKLFDO�XVHU�LQWHUIDFHV�DUHFRPSRVHG�RI�D�VHW�RI�SULPLWLYHFRPSRQHQWV��RU�ZLGJHWV�

\ %XWWRQV� VFUROO EDUV� PHQXV� GLDORJXH

ER[HV� WH[W HQWU\ ILHOGV

] 7KHVH�ZLGJHWV�VKRXOG�EHFXVWRPL]DEOH�DQG�UHXVDEOH�LQ�DQ\FRQWH[W��QRW�KDQG�FRGHG�IRU�HYHU\DSSOLFDWLRQ

] 7KHUHIRUH��VKRXOG�QRW�KDYHNQRZOHGJH�RI�WKH�DUFKLWHFWXUH�LQZKLFK�WKH\�DUH�SODFHG

Button

Dialogue Box

Page 2: (/(& ˆ ([DPSOHV (QJLQHHULQJ6RIWZDUH6WUXFWXUHV · ,PSOHPHQWLQJ(YHQW &RQQHFWRU // Target implements this method. It is called by the // event connector whenever a new event is fired

*8,�&RPSRQHQWV�DQG�(YHQWV

] *8,�FRPSRQHQWV�LVVXH�UDLVH��HYHQWV�ZKHQ�WKH\DUH�LQYRNHG

\ %XWWRQV LVVXH EXWWRQ&OLFNHG

HYHQWV

\ 0HQXV LVVXH PHQX6HOHFWLRQ

HYHQWV

\ 6FUROO EDUV LVVXH VFUROO HYHQWV

\ 7H[W ILHOGV LVVXH WH[W FKDQJHGHYHQWV

\ HWF���

GUIComponent

ApplicationComponent

E

Button

Web PageNavigationComponent

E

Button

Button

E

E

Back button

Reload button

Forward button

-DYD�,PSOHPHQWDWLRQ�RI

(YHQWV

] $OO�HYHQWV�VXEFODVV(YHQW2EMHFW

\ 2QO\ ILHOG LV VRXUFH RI

HYHQW �H�J�� WKH EXWWRQ WKDW

UDLVHG WKH HYHQW�

] $OO�*8,�HYHQWV�VXEFODVV$:7(YHQW

\ 2QO\ ILHOG LV D XQLTXH

LQWHJHU LGHQWLILHU

] (J

\ $FWLRQ(YHQW IRU EXWWRQ

FOLFNV� PHQX VHOHFWLRQV� HWF

\ 7H[W (YHQW IRU HQWU\ LQ WH[W

ILHOG� HWFSee also http://www.javasoft.com/j2se/1.3/docs/api/index.html

$FWLRQ�(YHQW�&ODVV

] (�J���EXWWRQ��PHQXHYHQWV

] FRPPDQG�ILHOG�UHSUHVHQWVVWULQJ�IRUP�RI�HYHQW�WKDWRFFXUUHG

,PSOHPHQWLQJ�(YHQW

&RQQHFWRU

] 0HWKRG�VHHQ�E\�VRXUFH

\ YRLG UDLVH(YHQW �(YHQW2EMHFW H�

] 0HWKRG�VHHQ�E\�WDUJHW

\ YRLG FRQQHFW$V7DUJHW �(YHQW7DUJHW WDUJHW&RPSRQHQW�

] 0HWKRG�VHHQ�E\�FRQQHFWRU�LQ�WDUJHW

\ YRLG SHUIRUP(YHQW �(YHQW2EMHFW H�

Page 3: (/(& ˆ ([DPSOHV (QJLQHHULQJ6RIWZDUH6WUXFWXUHV · ,PSOHPHQWLQJ(YHQW &RQQHFWRU // Target implements this method. It is called by the // event connector whenever a new event is fired

,PSOHPHQWLQJ�(YHQW

&RQQHFWRU

// Target implements this method. It is called by the

// event connector whenever a new event is fired.

public interface EventTarget {

public void performEvent (EventObject e);

}

// Code sketch for event connector.

public class EventConnector {

// There are zero or more targets represented as a vectorprivate Vector targets = new Vector();

// When the source raises an event, the “performEvent”// method of each target is invokedpublic void raiseEvent (EventObject e) {

for (int i=0; i<targets.size(); i++) {EventTarget t = (EventTarget) targets.elementAt (i);t.performEvent (e);

}}

// Each target must register itself as a target of// this connector. Targets are simply added to the// “targets” vector.public void connectAsTarget (EventTarget targetComponent) {

targets.add (targetComponent);}

}

(YHQW�%DVHG�$UFKLWHFWXUH�

'RPDLQ

] 7KLV�VW\OH�VROYHV�WKH�SUREOHP�RI�FRQQHFWLQJFRPSRQHQWV�ZKHUH

\ 7KHUH�PD\�EH�PRUH�WKDQ�RQH�WDUJHW�VR�WKDW�PXOWLFDVWLV�XVHIXO

\ 7KH�VRXUFH�FRPSRQHQW�LV�EXLOW�WR�EH�UHXVHG�LQ�PDQ\FRQWH[WV

3URSHUWLHV

] 0RGLILDELOLW\

] 3HUIRUPDQFH

Page 4: (/(& ˆ ([DPSOHV (QJLQHHULQJ6RIWZDUH6WUXFWXUHV · ,PSOHPHQWLQJ(YHQW &RQQHFWRU // Target implements this method. It is called by the // event connector whenever a new event is fired

0RGLILDELOLW\

] 6RXUFH�KDV�QR�UHIHUHQFHWR�WDUJHW

] 7KHUHIRUH�FKDQJHV�LQ

\ WDUJHW

\ QXPEHU RI WDUJHWV

] GR�QRW�LPSDFW�VRXUFH

E

Source Target

3HUIRUPDQFH

] &RPPXQLFDWLRQ�EHWZHHQVRXUFH�DQG�WDUJHWUHTXLUHV�LQGLUHFWLRQ�WKURXJK�FRQQHFWRU�

] 0D\�KDYH�PLQRU�LPSDFWRQ�SHUIRUPDQFH

] $GYDQFHG�FRPSLOHUV��H�J�-DYD�KRWVSRW��FRPSLOHDZD\�WKLV�LQGLUHFWLRQ

E

Source Target

(/(&����

(QJLQHHULQJ�6RIWZDUH�6WUXFWXUHV

:HHN����6RIWZDUH

$UFKLWHFWXUH

/HFWXUH��

,PSOHPHQWLQJ�(YHQW

&RQQHFWRU

// Target implements this method. It is called by the

// event connector whenever a new event is fired.

public interface EventTarget {

public void performEvent (EventObject e);

}

Page 5: (/(& ˆ ([DPSOHV (QJLQHHULQJ6RIWZDUH6WUXFWXUHV · ,PSOHPHQWLQJ(YHQW &RQQHFWRU // Target implements this method. It is called by the // event connector whenever a new event is fired

([DPSOH�,PSOHPHQWDWLRQ�RI

WKH�(YHQW7DUJHW�,QWHUIDFH

public interface EventTarget {

public void performEvent (EventObject e);

}

// This class implements the EventTarget interface. This class// can contain any fields and methods, but must include an// an implementation of the performEvent method

public class HandleEvent implements EventTarget {

...

public void performEvent (EventObject e) {

System.out.println (“Got event ” + e);

}

...

}

,QWHUIDFHV

] &ODVVHV�PD\�LPSOHPHQW�DQ\�QXPEHU�RI�LQWHUIDFHV

\ EXW UHFDOO WKDW LQ -DYD� FODVVHV PD\ RQO\ LQKHULW IURP RQH RWKHU

FODVV

([DPSOH�$SSOLFDWLRQ�XVLQJ

(YHQW�'ULYHQ�$UFKLWHFWXUH

] )LUVW�VWHS�LQLPSOHPHQWLQJ�D�GUDZLQJSURJUDP

\ 8VHU FOLFNV RQ FDQYDV

\ 6XFFHVVLYH SDLUV JHQHUDWH

OLQHV

\ /LQHV VDYHG LQ OLVW

\ 7UDFH VKRZV OLQHV WKDW

ZHUH JHQHUDWHG

*click*

$Q�H[DPSOH

] &DSWXUH/LQHV FRPSRQHQW UHFRUGV PRXVH FOLFNV RQ D FDQYDV

\ HDFK SDLU RI FOLFNV JHQHUDWHV D OLQH

\ /LQH(YHQW HYHQWV VHQW WR DQ HYHQW FRQQHFWRU

] /LQHV FRPSRQHQW FROOHFWV WKHVH OLQHV LQWR D YHFWRU

] 7UDFH FRPSRQHQW SULQWV RXW OLQH HYHQWV DV WKH\ RFFXU

\ XVHIXO IRU GHEXJJLQJ

Page 6: (/(& ˆ ([DPSOHV (QJLQHHULQJ6RIWZDUH6WUXFWXUHV · ,PSOHPHQWLQJ(YHQW &RQQHFWRU // Target implements this method. It is called by the // event connector whenever a new event is fired

Classes used inapplication

&DSWXUH/LQHV

] &DSWXUHV�PRXVH�FOLFNHYHQWV�IURP�XVHU

] 0DLQWDLQV�ODVW�SRLQWFOLFNHG

] &UHDWHV�/LQH(YHQWFRQWDLQLQJ�ODVW�SRLQWDQG�QHZ�SRLQW

/LQH(YHQW

] 7KH�OLQH�UXQV�IURPVRXUFH3RLQW�WRWDUJHW3RLQW

] (DFK�SRLQW�LV�DFRRUGLQDWH��FRQWDLQLQJDQ��[�\��SDLU

class CaptureLines implements MouseListener { private EventConnector e; private Point lastPoint = null; JFrame frame;

public void mouseClicked(MouseEvent mevt) {Point newPoint = mevt.getPoint();if (lastPoint == null) { lastPoint = newPoint;} else { LineEvent levt =

new LineEvent ( this, lastPoint, newPoint);

lastPoint = newPoint;

e.raiseEvent (levt);}

} ...

Page 7: (/(& ˆ ([DPSOHV (QJLQHHULQJ6RIWZDUH6WUXFWXUHV · ,PSOHPHQWLQJ(YHQW &RQQHFWRU // Target implements this method. It is called by the // event connector whenever a new event is fired

class CaptureLines implements MouseListener { ...

public CaptureLines (EventConnector e) {this.e = e;

JFrame frame = new JFrame("FrameDemo");

frame.addMouseListener (this);frame.setSize (500, 400);frame.setVisible (true);

}}

// Records lines into a list of lines

public class Lines implements EventTarget { // The lines that have been added private Vector lines = new Vector();

// Add a new line into the list of lines public void performEvent (EventObject e) {

lines.add (e); }

// Return the list of lines public Vector getLines() {

return lines; }}

import java.util.EventObject;import java.awt.Point;

// Simply traces events as they occur.

public class Trace implements EventTarget { public void performEvent (EventObject e) {

LineEvent nextLine = (LineEvent) e;Point p1 = nextLine.getSourcePoint();Point p2 = nextLine.getTargetPoint();

System.out.println ("Got line: " + "(" + Math.round(p1.getX())

+ "," + Math.round (p1.getY()) + ")" + "->" + "(" + Math.round(p2.getX()) + ",”

+ Math.round(p2.getY()) + ")" ); }}

import java.util.EventObject;import java.awt.Point;

public class LineEvent extends EventObject { private Point sourcePoint; private Point targetPoint;

public Point getSourcePoint () {return sourcePoint;

}

public Point getTargetPoint () {return targetPoint;

}

public LineEvent (Object source, Point sourcePoint, Point targetPoint) {

super(source);this.sourcePoint = sourcePoint;this.targetPoint = targetPoint;

}}

Page 8: (/(& ˆ ([DPSOHV (QJLQHHULQJ6RIWZDUH6WUXFWXUHV · ,PSOHPHQWLQJ(YHQW &RQQHFWRU // Target implements this method. It is called by the // event connector whenever a new event is fired

import java.util.EventObject;

// Target implements this method. It is called by the// event connector whenever a new event is fired.

public interface EventTarget { public void performEvent (EventObject e);}

import java.util.Vector;import java.util.EventObject;

public class EventConnector { private Vector targets = new Vector();

public void raiseEvent (EventObject e) {for (int i=0; i<targets.size(); i++) { EventTarget t =

(EventTarget) targets.elementAt (i); t.performEvent (e);}

}

public void connectAsTarget ( EventTarget targetComponent) {

targets.add (targetComponent); }}

(/(&����

(QJLQHHULQJ�6RIWZDUH�6WUXFWXUHV

:HHN����6RIWZDUH

$UFKLWHFWXUH

/HFWXUH��

([DPSOH�$SSOLFDWLRQ�XVLQJ

(YHQW�'ULYHQ�$UFKLWHFWXUH

] 6HFRQG�VWHS�LQLPSOHPHQWLQJ�D�GUDZLQJSURJUDP

\ 8VHU FOLFNV RQ FDQYDV

\ 6XFFHVVLYH SDLUV JHQHUDWH

OLQHV

\ /LQHV VDYHG LQ OLVW

\ 7UDFH VKRZV OLQHV WKDW

ZHUH JHQHUDWHG

\ /LQHV GUDZQ RQ FDQYDV

*click*

Page 9: (/(& ˆ ([DPSOHV (QJLQHHULQJ6RIWZDUH6WUXFWXUHV · ,PSOHPHQWLQJ(YHQW &RQQHFWRU // Target implements this method. It is called by the // event connector whenever a new event is fired

$Q�H[DPSOH

] &DSWXUH/LQHV FRPSRQHQW

EHFRPHV D WDUJHW RI WKH

HYHQW FRQQHFWRU

] SHUIRUP(YHQW PHWKRG DGGHG

WR &DSWXUH/LQHV WR GUDZ OLQHV

DV WKH\ DUH JHQHUDWHG

class CaptureLines implements MouseListener, EventTarget {private EventConnector e;

... public void performEvent (EventObject e) {

LineEvent nextLine = (LineEvent) e;

Graphics g = frame.getGraphics();

// Extract the points of the line from the event Point p1 = nextLine.getSourcePoint(); Point p2 = nextLine.getTargetPoint();

int x1=(int)Math.round (p1.getX());int y1=(int)Math.round (p1.getY());int x2=(int)Math.round (p2.getX());int y2=(int)Math.round (p2.getY());

// Draw the line in the windowg.drawLine (x1, y1, x2, y2);

}...

}

public class Main { public static void main(String[] args) {

// Create the connectorEventConnector ec = new EventConnector();

// Create the line event generatorCaptureLines captureComponent = new CaptureLines (ec);...// The third target is the line generator itselfec.connectAsTarget (captureComponent);

}}

0RGLILFDWLRQ��0DNH�WKLV�SURJUDP

PXOWLXVHU�E\�DGGLQJ�D�VHFRQG�ZLQGRZ

Page 10: (/(& ˆ ([DPSOHV (QJLQHHULQJ6RIWZDUH6WUXFWXUHV · ,PSOHPHQWLQJ(YHQW &RQQHFWRU // Target implements this method. It is called by the // event connector whenever a new event is fired

$UFKLWHFWXUDO�0RGLILFDWLRQ�WR

6XSSRUW�6HFRQG�:LQGRZpublic class Main { public static void main(String[] args) {

// Create the connectorEventConnector ec = new EventConnector();

// Create the line event generatorCaptureLines captureComponent = new CaptureLines (ec);...// The third target is the line generator itselfec.connectAsTarget (captureComponent);

// And let's create another window - we can draw lines there// as well!CaptureLines anotherCaptureComponent = new CaptureLines (ec);ec.connectAsTarget (anotherCaptureComponent);

}}

6XPPDU\

] (YHQW�EDVHG�DUFKLWHFWXUH�VW\OH�KDV�JRRG�PRGLILDELOLW\SURSHUWLHV

] :H�VDZ

\ $GGLWLRQ RI GUDZLQJ IXQFWLRQDOLW\ WR SURJUDP

[ 5HTXLUHG FRQQHFWLRQ RI &DSWXUH/LQHV DV WDUJHW DV ZHOO DV VRXUFH

RI HYHQW FRQQHFWRU

[ 5HTXLUHG DGGLWLRQ RI SHUIRUP(YHQW LQ &DSWXUH/LQHV WR DFWXDOO\

GUDZ WKH OLQH

\ $GGLWLRQ RI DQRWKHU ZLQGRZ

[ 5HTXLUHG FUHDWLRQ RI QHZ LQVWDQFH RI &DSWXUH/LQHV

[ 5HTXLUHG FRQQHFWLRQ RI WKLV QHZ LQVWDQFH DV VRXUFH DQG WDUJHW RI

HYHQW FRQQHFWRU

([DPSOH��(YHQW�%DVHG

3URJUDPPLQJ�LQ�WKH�$:7

] -DYD�KDV�WZR�JUDSKLFV�OLEUDULHV

\ $EVWUDFW :LQGRZLQJ 7RRONLW �$:7�

\ 6LQFH -DYD � SODWIRUP� 6ZLQJ EXLOGV RQ $:7

] %RWK�DUH�HYHQW�EDVHG

] 'R�QRW�KDYH�H[SOLFLW�HYHQW�FRQQHFWRUV

\ (YHQW FRQQHFWRUV EXLOW LQWR VRXUFH FRPSRQHQWV

] 3ULPLWLYH�HYHQWV�JHQHUDWHG�E\�UXQWLPH�V\VWHP

\ 0RXVH FOLFNV� PRXVH PRWLRQ� NH\ FOLFNV

Page 11: (/(& ˆ ([DPSOHV (QJLQHHULQJ6RIWZDUH6WUXFWXUHV · ,PSOHPHQWLQJ(YHQW &RQQHFWRU // Target implements this method. It is called by the // event connector whenever a new event is fired

6XEVFULELQJ�WR�0RXVH�(YHQWV

] $OO�*8,�FRPSRQHQWV�DUHVXEFODVVHV�RIMDYD�DZW�&RPSRQHQW

] 0RXVH�NH\ERDUG�HYHQWVVHQW�IURP�FRPSRQHQWV�WRDOO�LQWHUHVWHG�WDUJHWFRPSRQHQWV

0RXVH�(YHQWV�LQ�2XU�$SSOLFDWLRQ

] :LQGRZV�DUHLPSOHPHQWHG�XVLQJMDYD[�VZLQJ�-)UDPHFRPSRQHQW

] &DSWXUH/LQHV�FRPSRQHQWLV�WDUJHW�RI�WKHVH�HYHQWV

] ,Q�RUGHU�WR�UHFHLYH�WKHVHHYHQWV��&DSWXUH/LQHVPXVW�UHJLVWHU�ZLWK�WKH-)UDPH�FRPSRQHQW

&DSWXUH/LQHV�UHJLVWHUV�LWVHOI�DV�D

7DUJHW�IRU�0RXVH(YHQWV�JHQHUDWHG�E\

-)UDPH

class CaptureLines implements MouseListener, EventTarget { ... JFrame frame;

public CaptureLines (EventConnector e) {...// Create a window in which a user can clickframe = new JFrame("Useless Drawing Program");...// Adds this object as a target for mouse events// generated in this window. This method requires// an object of type MouseListener . frame.addMouseListener (this);...

}}

0RXVH�(YHQWV

] 3URYLGHV�LQIRUPDWLRQ�RQ

\ /RFDWLRQ ZKHUH PRXVH ZDV

FOLFNHG

\ 1XPEHU RI FOLFNV

[ 'LVWLQJXLVK EHWZHHQ

GRXEOH DQG VLQJOH�FOLFN

Page 12: (/(& ˆ ([DPSOHV (QJLQHHULQJ6RIWZDUH6WUXFWXUHV · ,PSOHPHQWLQJ(YHQW &RQQHFWRU // Target implements this method. It is called by the // event connector whenever a new event is fired

0RXVH/LVWHQHU�,QWHUIDFH

// Generates a mouse click eventvoid mouseClicked(MouseEvent e)

// Generates an event when the mouse moves over the componentvoid mouseEntered(MouseEvent e)

// Generates an event when the mouse moves off the componentvoid mouseExited(MouseEvent e)

// Generates an event when a mouse button is depressedvoid mousePressed(MouseEvent e)

// Generates an event when a mouse button is releasedvoid mouseReleased(MouseEvent e)

class CaptureLines implements MouseListener, EventTarget { ...

public void mouseClicked(MouseEvent mevt) {Point newPoint = mevt.getPoint();if (lastPoint == null) { // This is the first click - record this point lastPoint = newPoint;} else { // Create a line event recording a line from the last point // to this new point, then record the new point. LineEvent levt = new LineEvent (this, lastPoint, newPoint); lastPoint = newPoint;

// Fire the event e.raiseEvent (levt);}

}

// These are other mouse events that may arise; we ignore these public void mouseEntered(MouseEvent e) {} public void mouseExited(MouseEvent e) {} public void mousePressed(MouseEvent e) {} public void mouseReleased(MouseEvent e) {}

...}