(/(&����
(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
*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�
,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
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);
}
([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
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);}
} ...
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;
}}
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*
$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
$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
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
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) {}
...}