Download Event Driven Programming

Survey
yes no Was this document useful for you?
   Thank you for your participation!

* Your assessment is very important for improving the work of artificial intelligence, which forms the content of this project

Document related concepts
no text concepts found
Transcript
Event Driven Programming
Part 3 – Event Handling
Chapter 12
CS 2334
University of Oklahoma
Brian F. Veale
1
Events
• All interaction with a GUI program is through
events
–
–
–
–
Mouse clicks
Button presses
Text Entry
Menu selection
2
Event Handling
• By default, some components appear to react
to certain interaction
– JScrollPanes will scroll
– JButtons will change color when clicked
• In order to write functional GUI programs we
must handle some events
• Java uses Listeners to manage event handling
3
Listeners
• When we register an object as a Listener it
takes responsibility for certain events
– Only responsible for events from certain other
components
– Only responsible for a limited class of events
• Listeners are actually interfaces
– They are a group of methods that we agree to
implement
– Depending on the kind of Listener, we can have a
large number of methods to implement
4
Common Listener Interfaces
• ActionListener
– Button being pressed
– Pressing return in a text field
– Selecting a menu item
• MouseListener
– Pressing a mouse button while over a certain component
• WindowListener
– Closing the main window
• KeyListener
– Pressing keys on the keyboard
• MenuListener
– Opening a menu
– Selecting a menu item
• More Listener Methods in the Java Tutorial – Listener API Table
• http://java.sun.com/docs/books/tutorial/uiswing/events/api.htm
l
5
Implementing Event Handling
• Lets make it so that our GUI programs exit when we
close the window
– This can be annoying if not handled
– Without doing this, your windows disappear, but never exit
• This is going to be a window event connected to the
JFrame
• We’ll need to use a WindowListener
– WindowListener interface has 7 methods
• Every single one must be implemented
– The Adapter classes comes to our rescue, maybe
• You inherit from an Adapter class
• It contains skeletons for all corresponding Listener methods
– Difficulties
• Can only inherit from one class
• Not all Listeners have an Adapter
• Other option is to have skeleton methods for all the parts of the
interface that we won’t use
6
Exiting a Program Upon Window Closing
• Which method of WindowListener should we use?
– void windowActivated(WindowEvent e)
• Invoked when the Window is set to be the active Window.
– void windowClosed(WindowEvent e)
• Invoked when a window has been closed as the result of calling
dispose on the window.
– void windowClosing(WindowEvent e)
• Invoked when the user attempts to close the window from the
window's system menu.
– void windowDeactivated(WindowEvent e)
• Invoked when a Window is no longer the active Window.
– void windowDeiconified(WindowEvent e)
• Invoked when a window is changed from a minimized to a normal
state.
– void windowIconified(WindowEvent e)
• Invoked when a window is changed from a normal to a minimized
state.
– void windowOpened(WindowEvent e)
• Invoked the first time a window is made visible.
7
windowClosed() or windowClosing()
• void windowClosed(WindowEvent e)
• Invoked when a window has been closed as the result of
calling dispose on the window.
• void windowClosing(WindowEvent e)
• Invoked when the user attempts to close the window from
the window's system menu.
• Window.dispose()
– Releases all of the native screen resources used by the
Window.
– We will not work directly with instances of Window and
therefore cannot control when dispose() is called.
• windowClosing() seems like the best option
8
Modifications to the Program
• frame.addWindowListener(this);
– The parameter is the name of the object that will handle
the event
– This line tells the component which object is responsible
for responding to this action
• Class Button extends WindowAdapter or Class Button
implements WindowListener
– The responding object must either extend the
WindowAdapter
• Only have to implement methods we’ll be using in
WindowListener
– or implement the WindowListener interface
• Have to write at least a skeleton for all methods in
WindowListener
• Write a method body for the responding object
9
Demo Programs that use windowClosing()
• ButtonWithWindowClosing.java
• LabeledScrollingList3.java
10
ActionListener
• Very high level event handler
– Can avoid some of the other types of event listeners
if we use ActionListener
• Very common type of listener
– Button presses
– Menu item selection
• Has a single method
– public void actionPerformed(ActionEvent e)
11
Handling ActionEvents
• We can make a single object the ActionListener for
many other components
– Must distinguish who sent the event
– This data is stored in the ActionEvent object passed to
actionPerformed
– Methods for extracting event source info from
ActionEvent
• Object getSource()
– Returns the object that generated the call to actionPerformed
• String getActionCommand()
– Returns a string that contains the text of the object
– Can use setActionCommand to alter for an object
– Can be used for modal buttons
12
Other methods in ActionEvent
• long getWhen()
– Gives us the time and date the event occurred
– Can convert to human-readable with Date class
• int getModifiers()
– Returns data on modifier keys pressed during event
(Ctrl, Shift, etc.)
• String paramString()
– Very useful for debugging
– Presents detailed information about event in textual
form
13
ActionListener Demo
• ActionEvents.java
14
WindowAdapter
• In ActionEvents.java, to use a WindowAdapter
to close the window, we had to create an inner
class.
• Inner classes are a reality of life in Java GUI
programs at times....
• But, is there a better way to close the window
when the user clicks on the window close
button?
15
public void setDefaultCloseOperation(int operation)
• Sets the operation that will happen by default when the user initiates a
"close" on this frame.
– WindowConstants.DO_NOTHING_ON_CLOSE
• Don't do anything; require the program to handle the operation in the
windowClosing method of a registered WindowListener object.
– WindowConstants.HIDE_ON_CLOSE
• Automatically hide the frame after invoking any registered
WindowListener objects.
• Default action.
– WindowConstants.DISPOSE_ON_CLOSE
• Automatically hide and dispose the frame after invoking any registered
WindowListener objects.
– JFrame.EXIT_ON_CLOSE
• Exit the application using the System exit method. Use this only in
applications.
16
Data Models
• We can develop a data model for our program
– Abstract Data Type
• Our ADT can be stored in a JList
• Demo 1:
– LabeledScrollingList4.java
– State.java
• Demo 2:
– StateListModel.java
– LabeledScrollingList5.java
17
JList Mania
• The nomenclature for Swing JLists is somewhat
confusing
–
–
–
–
–
JList
List
Vector
DefaultListModel
ArrayList
• Keeping these classes differentiated is
important
18
Every JList has a data view
• data view = data model
• A JList is a GUI component
– It shows us a view of some data
• The items in the list
• We tell the JList what data to show when we construct it
• JLIst myList = new JList(Vector theData);
• This view is not inherently dynamic
– Call the constructor as above and then try to change
the vector’s data
– Won’t work too well (not at all)
19
Making a dynamic JList
• Updating a JList
– myList.setListData(Vector theNewData);
• The JList will now show the current contents of the
theNewData vector
• Does this mean the Data model must be a Vector
– It could be a Vector
• Vector is part of the JCF
– Can be used as a List
» We can use Collections.sort()
» Can use all List methods
– It doesn’t have to be a Vector
• Can use another JCF List type
• Just make a method that returns a Vector of your List
contents
20
Dynamic Lists Demo
• DynamicStateLists.java
21
Clicking on a JList
• There are three ways to find out which item was clicked on in a
JList
– myJList.getSelectedIndex()
• This can work at any time
• Can be in ActionPerformed for a button
– ListSelectionListener
• Listener interface with only a single method
• public void valueChanged(ListSelectionEvent e)
• Called whenever the selected item changes
– MouseListener
•
•
•
•
•
Has seven methods
public void mouseClicked(MouseEvent e)
Add this listener to JList
Can detect single or double clicks
Call getSelectedIndex() to determine which item was clicked
22
Beyond the JOptionPane
• JOptionPane was used in CS 1323 to create GUI based interfaces
• Very easy to use
– One line of code
– Don’t necessarily need to use with Event Listeners
• Lack some versatility
– Has only a single line of input
– Must have a long chain of these dialogs for object input
• Uses
– Short message dialogs
– Actions that only need confirmation
• Yes/No
• OK/Cancel
• http://java.sun.com/docs/books/tutorial/uiswin
g/components/dialog.html
23
JDialog
• Swing component for Dialogs
– Used for modal or non-modal dialog windows
• Modal dialog: does not allow the user to interact with the
rest of the program while dialog is active
• Non-Modal dialog: user can interact with program while
dialog is active
– Construction
• Typically, we would write a class that inherits from JDialog
• JDialog myDialog = new JDialog (JFrame owner, boolean
modal)
– The owner frame is the JFrame from which the dialog is
shown
– Modal can be set either true or false
– Many other forms for the JDialog constructor
24
How to design and use Dialogs
• This is a confusing topic for many students.
PersonEditDialog
Controller Pattern
dialog
person
person
name
email
etc.....
Person/Student/Professor
25
Dialog Demos
• SimpleDialog Demo
– StudentDialog.java
– StudentEx.java / PersonEx.java
• PersonEditDialog Demo
– PersonEditDialog.java
– Student.java / Professor.java / Person.java
• PersonEditDialog with Exception Handling
– PersonEditDialogEx.java
– StudentEx.java / ProfessorEx.java /PersonEx.java
26