Event Handling Basics Event handling always has the following pattern –Involves 3 distinct roles Source object which is object of interest –Generates events under certain conditions –In Swing these are user activities Event object that describes what happened –Encapsulates the event context –Who did what, on which object, etc Listeners which receive events –Receiving an event is a method call on the listener –Different categories of event listeners
Event Handling Basics Listeners are registered with source objects –Ties them together –Informs the source object about who to deliver events to This is a many-many relationship –A source object may have multiple listeners –A listener may listen to multiple source objects
Event Handling in Robocode Think back to the Robocode examples… The Arena was the source of interesting events –Has a bullet hit, have I seen another robot? There were different event objects –BulletHitEvent, RobotScannedEvent The Robot could listen for events by implementing specific methods –onBulletHit, onRobotScanned Robot base class handled registration for you –And provided do nothing versions of the above methods
Event Handling Conventions Listeners are described using interfaces Naming convention: XXXListener –Where XXX denotes the category of listener E.g. WindowListener –Creating a listener means implementing that interface Register a listener with the addXXXListener method on the source object –Generally a removeXXXListener also –Source object will be a Swing component, i.e. a sub- class of java.awt.Component –The Component class provides the add/remove methods
Event Handling Conventions Event object typically extend java.awt.Event –Some of the newer ones dont Events share some common attributes –a timestamp, source object, etc
Event Handling Conventions
Mouse Events Natural for Swing to expose mouse-related events –Its how the user interacts with the GUI MouseListener interface describes the basic events Each method accepts a MouseEvent object parameter java.awt.Component has add/remove listener methods
So, capturing basic mouse events involves: –Creating an implementation of MouseListener –Calling addMouseListener on one or more Components to register it Example code…
Action Events Very tedious implementation if all activities were dealt with as individual clicks Swing provides higher level action event Meaning of event depends on component –E.g. button click, menu selection, etc Basic classes: –ActionEvent – identifies action, key modifiers, etc –ActionListener – single actionPerformed method –addActionListener, removeActionListener methods on Component
Window Events Swing allows the capturing of window related events –Activate, deactivate, minimise, open, close etc setDefaultCloseOperation is only useful if you dont want to do anything complex Basic classes/methods –WindowEvent – identifies Window –WindowListener – range of methods –addWindowListener, removeWindowListener methods on JFrame, JWindow, JDialog
Other Swing Events More Mouse events –Mouse motion, mouse wheels Item events –Selecting/deselecting items in lists, checkboxes, etc Key Events –Raw keyboard input Tree Events –Opening/closing nodes in a tree component Drag and drop …and many more. See javax.swing.event and java.awt.event packages.
Developing the Calculator To add functionality to the Calculator GUI we need to: Implement the ActionListener interface to respond to button clicks –Can do this on the ButtonPanel class Associate this with each button on the calculator
The Calculator Logic Check which button has been clicked –Use ActionEvent.getObject to get the button –Then ask the button for its action command, getActionCommand Clicked a number button? –Then update the JTextField to add digits –Use getText and setText methods Clicked the point button? –Then add a decimal point, but only once!
The Calculator Logic Clicked an operator (+, -, etc)? –Then store current value of JTextField (first number) –And, remember which operator –And, reset the field (for the second number) –Finally set a flag to indicate were in a calculation Clicked the equals button? –Then take the first number and the current value of the JTextField, and ask a Calculator object to do the math –Display the result –And reset the calculation flag
The Calculator Logic The Calculator object can be very simple –Adapt our earlier implementation… –Use double for extra precision