280 likes | 376 Views
Abstract Windowing Toolkit. Support for Graphical User Interface (Event-driven programming). Batch Programs -> Interactive Programs => Graphical User Interfaces AWT Classes for creating GUIs; organized as inheritance hierarchy.
E N D
Abstract Windowing Toolkit Support for Graphical User Interface (Event-driven programming) java12AWT
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 java12AWT
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. java12AWT
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(); } } java12AWT
{ ... 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(); ...} java12AWT
{ ... 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(); ...} java12AWT
Applet Version import java.awt.*; import java.applet.*; public class DemoAwt2 extends Applet { …init-code... public void start() { show(); } public void stop() { hide(); } } java12AWT
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> */ java12AWT
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 instancefields id, target, x, y, when, key, modifier, etc. • An event model specifies the protocol used to process/handle events. java12AWT
Java 1.0 Event Model • Role of inheritancehierarchy • 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. java12AWT
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.) java12AWT
Event model for Java 1.1 and Beans • 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 source listener java12AWT
OO-Events • java.awt.events.* • class java.util.EventObject • interface java.util.EventListener • “Design Pattern” • event type EVevent • interfaceEVListener • source. addEVListener (target) • source. setEVListener (target) • targetimplements EVListener • classEVAdapter Source can safely call any method in the interface on all (corresponding) listener targets. java12AWT
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()); }} java12AWT
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); } java12AWT
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()); } } ); java12AWT
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); } java12AWT
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. java12AWT
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 toJava 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. java12AWT
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(); } java12AWT
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); } java12AWT
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); } } java12AWT