cs884(Prasad) java12AWT 1
Abstract Windowing Toolkit
Support for Graphical User Interface
(Event-driven programming)
cs884(Prasad) java12AWT 2
• Batch Programs Interactive Programs
Graphical User Interfaces• AWT
– Classes for creating GUIs; organized as inheritance hierarchy.
– Define the structure (geometry) and the (default) behavior of the components
(“look and feel”)
– Java-Components ~ X-Widgets ~ ActiveX-Controls
cs884(Prasad) java12AWT 3
AWT classes
• Component: – Basic: Button, Choice, Checkbox, List, Canvas,
Label, Scrollbar, etc– Container: Panel, ScrollPane, Window (Dialog,
FileDialog, Frame), etc• A container instance can hold component instances.
• LayoutManager: FlowLayout, GridLayout, BorderLayout, CardLayout, etc
• Automatically manage the relative positioning of the component instances within a container instance.
cs884(Prasad) java12AWT 4
Structure Example
import java.awt.*;
public class DemoAwt extends Frame {
Label l = new Label(“Demo”, Label.CENTER);
Button b = new Button(“No Op”);
Checkbox c = new Checkbox(“WindowsNT”);
List li = new List();
… constructor definition...public static void main (String[] argv) {
new DemoAwt(); }
}
cs884(Prasad) java12AWT 5
{ ...
DemoAwt() {resize(200,300);
setLayout(new FlowLayout());
add(l); add(b);
add(new TextField(“TEXT”) ); add(c); add(li);
li.addItem(“Netcape”);
li.addItem(“SUN”); show();
...}
cs884(Prasad) java12AWT 6
{ ...
DemoAwt() {resize(250,150);
setLayout(new BorderLayout());
// default add(“North”,l); add(“South”,b);
add(“Center”, new TextField(“T”));
add(“East”,c); add(“West”,li);
li.addItem(“Netcape”);
li.addItem(“SUN”); show();
...}
cs884(Prasad) java12AWT 7
Applet Version
import java.awt.*;
import java.applet.*;public class DemoAwt2 extends Applet { …init-code... public void start() { show(); } public void stop() { hide(); }}
cs884(Prasad) java12AWT 8
public void init() {
List li = new List();
li.addItem(“Netcape”);
li.addItem(“SUN”);
add(new Label(“Demo”)); add(new Button(“No Op”));
add(new Checkbox(“WindowsNT”)); add(li);
}
/* <applet code=DemoAwt2 width=250 height=300> </applet>
*/
cs884(Prasad) java12AWT 9
Adding Behavior : Event Model
• An event, such as mouse click, mouse motion, keyboard input, etc, associated with a component, can trigger a specific (event handler) method.
• Event instance fields id, target, x, y, when, key, modifier, etc.
• An event model specifies the protocol used to process/handle events.
cs884(Prasad) java12AWT 10
• Role of inheritance hierarchy – To associate an event-handler with a
component class, it must be sub-classed, to override the default handler.
• Role of containment hierarchy– If an event-handler associated with the target
returns true, then the event has been processed. Otherwise, the event is propagated to its container, for further processing.
Java 1.0 Event Model
cs884(Prasad) java12AWT 11
Problems
• Code Organization– Proliferation of sub-classes.– Complex switch in the top-level handleEvent().
• No clear separation between application code and the GUI.
• Efficiency– No filtering of events. (Events delivered to a
component even when an event is not handled.)
cs884(Prasad) java12AWT 12
• Delegation-based Model– Event object propagated from source to
listener by invoking an event-specific method on a listener.
– The listener implements an appropriate EventListener interface, and registers itself with the source.
Event model for Java 1.1 and Beans
source listenerevent
cs884(Prasad) java12AWT 13
• OO-Events – java.awt.events.*– class java.util.EventObject– interface java.util.EventListener
• “Design Pattern”– event type EVevent– interface EVListener– source . addEVListener (target)– source . setEVListener (target)– target implements EVListener– class EVAdapter
Source can safely call any method in the interface on all (corresponding) listener targets.
cs884(Prasad) java12AWT 14
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
public class Scribble11 extends Applet implements MouseListener, MouseMotionListener {
int oldX, oldY; Graphics g; …init()...
public void mousePressed(MouseEvent e) {
oldX = e.getX(); oldY = e.getY(); }
public void mouseReleased(MouseEvent e){}
public void mouseClicked(MouseEvent e){}
public void mouseEntered(MouseEvent e){}
public void mouseExited(MouseEvent e){}
public void mouseMoved(MouseEvent e){}
public void mouseDragged(MouseEvent e) {
g.drawLine( oldX, oldY, e.getX(), getY());
}}
cs884(Prasad) java12AWT 15
public void init() {g = getGraphics();addMouseListener(this);addMouseMotionListener(this);
Button bgB = new Button("Change Color");bgB.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) {
setBackground( newColor());repaint(); } } );
add(bgB); Button clearB = new Button("Clear");
clearB.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) {
Color c = g.getColor(); g.setColor(getBackground());
g.fillRect(0, 0, bounds().width, bounds().height); g.setColor(c);} } ;
add(clearB);}
cs884(Prasad) java12AWT 16
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
public class Scribble22 extends Applet { int oldX, oldY;
Graphics g; public void init() { g = getGraphics(); addMouseListener( new MouseAdapter() {
public void mousePressed(MouseEvent e) { oldX = e.getX(); oldY = e.getY();
} } ); addMouseMotionListener( new MouseMotionAdapter(){
public void mouseDragged(MouseEvent e) {
g.drawLine( oldX, oldY, e.getX(), e.getY()); } } );
cs884(Prasad) java12AWT 17
Button bgB = new Button("Change Color");bgB.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) {
setBackground( newColor());repaint(); } } );
add(bgB);
Button clearB = new Button("Clear");clearB.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) {
Color c = g.getColor(); g.setColor(getBackground());
g.fillRect(0, 0, bounds().width, bounds().height);
g.setColor(c);} } ; add(clearB);}
Event ClassListener interface/Source method/ (opt)Adapter class
Listener Methods
ActionEvent ActionListener/addActionListener()
actionPerformed()
AdjustmentEvent AdjustmentListener/addActionListener()
adjustmentValueChanged()
ContainerEvent containerListener/addContainerListener()/ContainerAdapter
componentAdded()componentRemoved()
FocusEvent FocusListener/addFocusListener()/FocusAdapter
focusGained()focusLost()
ItemEvent ItemListener/addItemListener()
itemStateChanged()
cs884(Prasad) java12AWT 19
ComponentEvent
ComponentListener/addComponentListener()/ComponentAdapter
componentHidden()componentMoved()componentResized()componentShown()
MouseEvent
MouseListener/addMouseListener()/MouseAdapter
MouseMotionListener/addMouseMotionListener()/MouseMotionAdapter
mouseClicked()mouseEntered()mouseExited()mousePressed()mouseReleased()
mouseDragged()mouseMoved()
cs884(Prasad) java12AWT 20
KeyEvent
KeyListener/ addKeyListener/ KeyAdapter
keyPressed()keyReleased()keyTyped()
TextEvent TextListener/addTextListener()
textValueChanged()
WindowEvent WindowListener/ addWindowListener()
windowActivated()windowClosed()windowClosing()windowDeactivated()windowDeiconified()windowIconified()windowOpened()
cs884(Prasad) java12AWT 21
Component Events Generated
Button ActionEvent
Checkbox ItemEvent
CheckboxMenuItem ItemEvent
Component ComponentEvent FocusEvent KeyEvent MouseEvent
Container ContainerEvent
cs884(Prasad) java12AWT 22
List ActionEvent ItemEvent
MenuItem ActionEvent
ScrollBar AdjustmentEvent
TextComponent TextEvent
TextField ActionEvent
Window WindowEvent
cs884(Prasad) java12AWT 23
Advantages
• Flexible• source-listener association dynamic.• 1-1, 1-n, n-1, n-m source-listener combinations.
• Efficient• Event-filtering: Deliver only to registered listeners.
• Separation of Application and GUI code• Enable (tool builders) run-time discovery
of events that a component generates/observes.
cs884(Prasad) java12AWT 24
Low-level Event Handling
• One can subclass a component, to process events, by overriding the following methods:– protected void processEvent(AWTEvent);– protected void processEV?Event(EV?Event);
These are analogous to Java 1.0 handleEvent() and specific event-handlers respectively.
• It is necessary to enable delivery of events using: – protected void enableEvents(long eventsToEnable);
Note: one cannot mix 1.0 and 1.1 event models.
cs884(Prasad) java12AWT 25
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
public class Scribble33 extends Applet {
int oldX, oldY;
Graphics g;
public void init() {
add( new Label("Scribbler: Press 'c' to clear.") );
g = getGraphics();
enableEvents(AWTEvent.MOUSE_EVENT_MASK |
AWTEvent.MOUSE_MOTION_EVENT_MASK |
AWTEvent.KEY_EVENT_MASK);
requestFocus();
}
cs884(Prasad) java12AWT 26
public void processMouseEvent(MouseEvent e) {
if (e.getID() == MouseEvent.MOUSE_PRESSED) {
oldX = e.getX(); oldY = e.getY();
}
else super.processMouseEvent(e);
}
public void processMouseMotionEvent(MouseEvent e) {
if (e.getID() == MouseEvent.MOUSE_DRAGGED) {
int x = e.getX(); int y = e.getY();
g.drawLine(oldX,oldY,x,y);
oldX = x; oldY = y;
}
else super.processMouseMotionEvent(e);
}
cs884(Prasad) java12AWT 27
public void processKeyEvent(KeyEvent e) {
if ( (e.getID() == KeyEvent.KEY_TYPED)
&& (e.getKeyChar() == 'c') ) {
Color temp = g.getColor();
g.setColor(getBackground());
g.fillRect(0, 0, getSize().width,
getSize().height);
g.setColor(temp);
}
else super.processKeyEvent(e);
}
}