Swing
Swing
• Lightweight components
– no separate (child)windows for components
– allows more variation on component structure
– makes L&F possible
• Three parts
– component set (subclasses of JComponent)
– support classes
– interfaces
Lecture 4: Swing 2
3
OTHER APIs
Lecture 4: Swing
PROGRAMMING GRAPHICAL USER INTERFACES
4
UI COMPONENTS
Lecture 4: Swing
PROGRAMMING GRAPHICAL USER INTERFACES
5
BUTTONS
Lecture 4: Swing
PROGRAMMING GRAPHICAL USER INTERFACES
6
JMenuBar
MENUS
Lecture 4: Swing
PROGRAMMING GRAPHICAL USER INTERFACES
PROGRAMMING GRAPHICAL USER INTERFACES
OTHER COMPONENTS
JComboBox JColorChooser
ImageIcon
JInternalFrame
JDialog
JFileChooser
Lecture 4: Swing 7
PROGRAMMING GRAPHICAL USER INTERFACES
OTHER COMPONENTS
JLabel JList
JScrollBar
JSplitPane
JTabbedPane
Lecture 4: Swing 8
PROGRAMMING GRAPHICAL USER INTERFACES
OTHER COMPONENTS
JTable
JTextArea
JTextField
JToolBar
JToolTip
JTree
Lecture 4: Swing 9
PROGRAMMING GRAPHICAL USER INTERFACES
ARCHITECTURE
• Goals:
– entirely on Java
– pluggable L&F
– model-driven programming
– JavaBeans
– compability with AWT
• Use MVC?
– Model represents the data
– View as a visual representation of
the data
– Controller takes input and
translates it to changes in data
Lecture 4: Swing 10
PROGRAMMING GRAPHICAL USER INTERFACES
THE UI DELEGATE
• No reason to separate controller and view
• A separate UI object for defining the visual
representation and controller behaviour
➜ the UI delegate
Lecture 4: Swing 11
PROGRAMMING GRAPHICAL USER INTERFACES
MODELS
• Data-centric applications
• Separate model interface for every component
– GUI-state models
• up-down state in JButton and subclasses
– application data models
• selection state in JToggleButton and subclasses
Lecture 4: Swing 12
PROGRAMMING GRAPHICAL USER INTERFACES
MODEL SEPARATION
• JSlider uses BoundedRangeModel
– public JSlider(int orientation, int min, int max, int value) {
checkOrientation(orientation);
this.orientation = orientation;
this.model = new DefaultBoundedRangeModel(value, 0, min, max);
this.model.addChangeListener(changeListener); updateUI();
}
Lecture 4: Swing 13
PROGRAMMING GRAPHICAL USER INTERFACES
CHANGE NOTIFICATION
• Models implement methods for adding and
removing listeners
• Lightweight notification
– only notify
– listener queries about the changes
– e.g. scrollabar dragged
• Stateful notification
– event described the change
– for complex data models
– e.g. changes in the column of table
Lecture 4: Swing 14
PROGRAMMING GRAPHICAL USER INTERFACES
LIGHTWEIGHT NOTIFICATION
• ChangeListener with one single method
– public void stateChanged(ChangeEvent e);
• Listening to JSlider
– JSlider slider = new JSlider();
BoundedRangeModel model = slider.getModel();
model.addChangeListener(new ChangeListener() {
public void stateChanged(ChangeEvent e) {
// need to query the model to get updated value...
BoundedRangeModel m = (BoundedRangeModel)e.getSource();
System.out.println("model changed: " + m.getValue());
}
});
Lecture 4: Swing 15
PROGRAMMING GRAPHICAL USER INTERFACES
STATEFUL NOTIFICATION
• Tracking JList selection
– String items[] = {"One", "Two", "Three");
JList list = new JList(items);
ListSelectionModel sModel = list.getSelectionModel();
sModel.addListSelectionListener
(new ListSelectionListener() {
public void valueChanged(ListSelectionEvent e) {
// get change information directly //
// from the event instance...
if (!e.getValueIsAdjusting()) {
System.out.println("selection changed: " +
e.getFirstIndex());
}
}
});
Lecture 4: Swing 16
PROGRAMMING GRAPHICAL USER INTERFACES
IGNORING MODELS
• Most components provide API to the model
directly
• E.g. JSlider’s method
– public int getValue() {
return getModel().getValue();
}
Lecture 4: Swing 17
PROGRAMMING GRAPHICAL USER INTERFACES
SETTING LOOK & FEEL
• To set a particular L&F (here CDE/Motif), write
– UIManager.setLookAndFeel(
"com.sun.java.swing.plaf.motif.MotifLookAndFeel”
);
Lecture 4: Swing 18
PROGRAMMING GRAPHICAL USER INTERFACES
THE SWING PACKAGES
• The Accessibility package (javax.accessibility)
– provides support for supporting the screen access products for
people with disabilities
– Swing has full support for accessibility
• javax.swing
– contains nearly all of the Swing components
– notable exception is JTextComponent (in javax.swing.text)
• javax.swing.border
– in need for customized borders, take a look
• javax.swing.event
– includes the additional event classes (not found in java.awt.event)
Lecture 4: Swing 19
PROGRAMMING GRAPHICAL USER INTERFACES
THE SWING PACKAGES (cont’d)
• javax.swing.plaf
– classes for providing the L&F capabilities
– also javax.swing.plaf.basic including the default L&F classes
– the current specialized L&F:s
• javax.swing.plaf.metal
• javax.swing.plaf.motif (or com.sun.java.swing.plaf.motif)
• javax.swing.plaf.windows (or com.sun.java.swing.plaf.windows)
– also javax.swing.plaf.multi for mixing multiple L&F:s
• javax.swing.table
– including support classes for managing tables
• javax.swing.tree
– support classes for managing trees
Lecture 4: Swing 20
PROGRAMMING GRAPHICAL USER INTERFACES
THE SWING PACKAGES (cont’d)
• javax.swing.text
– support classes for text editing
– Document classes
– JTextComponent (superclass for all text components)
– see also separate format packages
• javax.swing.text.html
• javax.swing.text.rtf
• javax.swing.undo
– classes for supporting undo/redo operations
Lecture 4: Swing 21
PROGRAMMING GRAPHICAL USER INTERFACES
JComponent
• An abstract root class of almost all
of Swing components
• Provides
java.lang.Object
– pluggable L&F
– extensibility
– smart trapping of keyboard events (see java.awt.Component
javax.swing.KeyStroke)
– customizable borders
– easy resizing java.awt.Container
– tool tips
– autoscrolling
– support for debugging
javax.swing.JComponent
– support for accessibility
– support for localization
Lecture 4: Swing 22