Transcript Slides

GUIs in Java
Swing, Events
CS2110, SW Development Methods
Readings:
MSD, Chapter 12
Lab Exercise
Why Study GUIs in CS2110
• First, why not?
– Complex topic, complex library
– Many classes, methods
– Hard to do this well initially
• Reasons we study GUIs
– Again, example of inheritance in a
framework, software reuse, etc.
– Event-driven programming
– An important form of program-control
2
Swing
• Swing is a Java library (framework) for
creating GUIs
– Part of a larger JFC (Java Foundation
classes)
– Replaces but uses an older library, AWT
– Another, newer alternative: SWT
– Used in Eclipse
• Swing apps will use look-and-feel of the
system they’re running on
– Or can be set by the program
3
Learning Swing
• Important things to learn
– Swing components
– E.g. buttons, text-fields, frames, etc.
– How to organize and arrange them
– Containers, layout managers
– How to make things change when
something happens
– Event-based programming
4
Containment Hierarchy
• Top-level container:
– place for other Swing components to paint
themselves
– e.g., JFrame, JDialog, Japplet
• Intermediate container:
– simplify positioning of atomic components
– e.g., JPanel, JSplitPane, JTabbedPane
5
Components and Containers
• See pages 809-816 in text
• All Swing GUI objects are Components
• Some are also Containers
– Example: JFrame, JPanel, etc
• You place other Components inside
Containers
– Example: a JFrame has buttons, text-fields, etc.
– Example: a JPanel is part of a window, in which
we organize GUI components
6
What We Do with Containers
• Add components to them
• Determine how these items will be
arranged on the screen
– Layout control
– We associate a Swing layout-manager with
each container
• Layout is very hard to do at the
beginning
– So we won’t sweat it in CS2110
7
Non-Containers
• Atomic components:
– self-sufficient components that present
information to and get input from the user
– e.g., JButton, JLabel, JList, JComboBox,
JTextField, JTable
8
Swing
• Components
and containers:
– superclasses
and interfaces
– extends
and implements
© O’Reilly 1999
9
Top-Level Containers
• JFrame example:
– contains a single component JRootPane, which
has a JMenuBar (optional) and a content pane
– add non-menu components to its content panel
– theFrame.add( aButton )
– Pre Java 5.0
– theFrame.getContentPane().add( aButton )
10
Events and User Interaction
• Programs so far:
main() is called and runs to completion
• Swing programs:
– “main” class has (or may be) a JFrame
– main() sets up the GUI and ends
– Program keeps running, waiting for and
responding to “events”
– Button pressed, text typed, window closed, etc
– Program is event-driven
11
Demo
12
Events
• Two approaches to event handling
– read-evaluation loop (client-written loop)
– notification-based (callbacks)
• Swing uses the 2nd approach
13
Events
• Swing:
– objects communicate by “firing” and
“handling” events (event objects)
– (conventional method call)
– events are sent from a single source object
to one or more registered listener objects
14
Events
• Swing:
– different event sources produce different
kinds of events
e.g., a JButton object, when clicked,
generates an ActionEvent object, which is
handled by an ActionListener (an object
whose class implements this interface)
15
MSD book, p. 837
16
Events
• Handling:
– create a component
– e.g., a JButton
– add it to the GUI
– e.g., to a JPanel
– register a listener to be notified when the
component generates an event
– e.g., interface ActionListener
– define the callback method
– e.g., actionPerformed()
17
Event Handling
• class MyListener implements ActionListener {
…
public void actionPerformed( ActionEvent event ) {
// react to event
…
}
}
• …
// instantiate event listener
ActionListener listener = new MyListener();
…
// instantiate event source
JButton button = new JButton( “Hello” );
…
// register event listener with event source
button.addActionListener( listener );
18
Common Technique (e.g. Jigloo)
• Use anonymous class to create a
listener object “on the fly”
// register event listener with event source
button1.addActionListener( new ActionListener()
{
public void actionPerformed(ActionEvent evt)
{
handlerForButton1Press(evt); //see below
}
});
... // and later you write the handler method
public void handlerForButton1Press(evt) {
// your code to handle button press
}
19
What’s this? Java Anonymous
Classes
• There’s a Java technique called anonymous
classes
– One of several types of nested class definition
– You’ll very often see it in GUI programming (Swing) and
with threads
• Situation:
– Sometimes Java’s design encourages us to create some
thing that might be used just once
– That thing needs to be wrapped up in a class, say because
we need a function object
• What couldn’t we just declare it at the same place
we use it? Why create a separate file?
Creating and Using an Anonymous Class
• Example: sort a list of Strings by their length
Collections.sort ( stringList, new Comparator() {
public int compare( Object o1, Object o2 ) {
return ((String) o1).length() - ((String) o2).length();
}
});
• We’ve created a new Comparator “on the fly”
– new creates a new instance, but what kind?
– Some object that implements Comparator
– Object not named, and its “true” class not named!
– What must a Comparator have? compare()
– We defined it right here, where it’s used!
Anonymous Classes: Comments
• Anonymous classes are unlike other classes
– They have no name
– Typically only implement methods in their interface or
superclass. No new methods!
– Since they have no name, can only define and use them at
one point in your code!
• Hard to understand at first? Sure!
– Naming an abstraction is important for human
understanding!
– Sorting, a Collection, Comparing
• Advice
– Keep them very short (and simple)!
– Be ready to understand them when you see them in Swing
and with threads