Swing

What is it?

Swing is the popular name given to the part of the Java Core API dealing with "lightweight," platform independent GUI components. The package javax.swing was added to the Core API in the Java 2 Platform. Before Swing, developers could only use a very limited set of GUI components which were nothing more than extremely thin wrappers over the native windowing system's own "heavyweight" components. New code should never use the old heavyweight components.

GUI programs in Java are both object-oriented and event-driven. You have

The events, listeners and "other stuff" comes from the "AWT"; Swing has the components. Actually there are some components in the AWT, and Swing has some events, listeners and other stuff, so we really can't just discuss one without the other. Historically, the AWT existed for a while before Swing was invented. The purpose of Swing was to replace all of the AWT components, while adding a handful of new events, listeners and other stuff. These notes will cover both the AWT and Swing.

Getting Started

You can start with Sun's Mini Swing Tutorial if you like. Sun also has a more detailed Swing Tutorial. You can also look at some of my own simple example programs.

Understanding the Overall Swing Architecture

Learning "all about Swing" takes time and not everyone needs to do it. However the more you know, the more productive you'll be. If you do get the big picture, you'll find yourself writing code the "right" way.

Here are some important things:

The rest of this page is a dense reference which is cool but pretty meaningless unless you've seen some examples and written code yourself. Go read some examples and write a few programs and then come back here.

Component Hierarchy

In this group of classes, don't use anything from java.awt.

java.lang.Object
    java.awt.Component
        java.awt.Button
        java.awt.Canvas
        java.awt.Checkbox
        java.awt.Choice
        java.awt.Label
        java.awt.List
        java.awt.Scrollbar
        java.awt.TextComponent
            java.awt.TextField
            java.awt.TextArea
        javax.swing.Box.Filler
        java.awt.Container
            java.awt.Panel
                java.applet.Applet
                    javax.swing.JApplet
            java.awt.Window
                java.awt.Frame
                    javax.swing.JFrame
                java.awt.Dialog
                    java.awt.FileDialog
                    javax.swing.JDialog
                javax.swing.JWindow
                javax.swing.BasicToolBarUI.DragWindow
            java.awt.ScrollPane
            javax.swing.Box
            javax.swing.CellRendererPane
            javax.swing.plaf.basic.BasicSplitPaneDivider
            javax.swing.tree.DefaultTreeCellEditor.EditorContainer
            javax.swing.JComponent
                javax.swing.AbstractButton
                    javax.swing.JButton
                    javax.swing.JMenuItem
                        javax.swing.JCheckBoxMenuItem
                        javax.swing.JMenu
                        javax.swing.JRadioButtonMenuItem
                    javax.swing.JToggleButton
                        javax.swing.JCheckBox
                        javax.swing.JRadioButton
                javax.swing.JColorChooser
                javax.swing.JComboBox
                javax.swing.JFileChooser
                javax.swing.JInternalFrame
                javax.swing.JInternalFrame.JDesktopIcon
                javax.swing.JLabel
                javax.swing.JLayeredPane
                    javax.swing.JDesktopPane
                javax.swing.JList
                javax.swing.JMenuBar
                javax.swing.JOptionPane
                javax.swing.JPanel
                javax.swing.JPopupMenu
                javax.swing.JProgressBar
                javax.swing.JRootPane
                javax.swing.JScrollBar
                    javax.swing.JScrollPane.ScrollBar
                javax.swing.JScrollPane
                javax.swing.JSeparator
                    javax.swing.JPopupMenu.Separator
                    javax.swing.JToolBar.Separator
                javax.swing.JSlider
                javax.swing.JSplitPane
                javax.swing.JTabbedPane
                javax.swing.JTable
                javax.swing.JTableHeader
                javax.swing.text.JTextComponent
                    javax.swing.JEditorPane
                        javax.swing.JTextPane
                    javax.swing.JTextArea
                    javax.swing.JTextField
                        javax.swing.JPasswordField
                javax.swing.JToolBar
                javax.swing.JToolTip
                javax.swing.JTree
                javax.swing.JViewport

Layout Managers

java.awt.FlowLayout
java.awt.BorderLayout
java.awt.GridLayout
java.awt.CardLayout
java.awt.GridBagLayout
javax.swing.BoxLayout
javax.swing.OverlayLayout

There are others, but they are pretty specialized and rarely used in application programs. For example ViewportLayout is used by JViewport, and ScrollPaneLayout is used by JScrollPane.

Models for the Components

Normally the state of a component is stored in the component's model, for example a JButton will have a ButtonModel that you can set with setModel() and retrieve with getModel(). You often write code like "button.getModel().setSelected(true)" though sometimes, Swing defines methods directly on the components that are passed through to the models.

ListModelJList
ComboBoxModelJComboBox
ButtonModelJButton, JToggleButton, JCheckBox, JRadioButton, JMenu, JMenuItem, JCheckBoxMenuItem, JRadioButtonMenuItem
DocumentJTextField, JPasswordField, JTextArea, JEditorPane, JTextPane
BoundedRangeModelJProgressBar, JScrollBar, JSlider
SingleSelectionModelJMenuBar, JPopupMenu, JTabbedPane
TableModelJTable
TableColumnModelJTable
TreeModelJTree
TreeSelectionModelJTree

Event Hierarchy

java.lang.Object
    java.util.EventObject
        java.awt.AWTEvent
            java.awt.event.ActionEvent
            java.awt.event.AdjustmentEvent
            javax.swing.event.AncestorEvent
            java.awt.event.ComponentEvent
                java.awt.event.ContainerEvent
                java.awt.event.FocusEvent
                java.awt.event.InputEvent
                    java.awt.event.KeyEvent
                        javax.swing.event.MenuKeyEvent
                    java.awt.event.MouseEvent
                        javax.swing.event.MenuDragMouseEvent
                java.awt.event.PaintEvent
                java.awt.event.WindowEvent
            java.awt.event.HierarchyEvent
            java.awt.event.InputMethodEvent
            javax.swing.event.InternalFrameEvent
            java.awt.event.InvocationEvent
            java.awt.event.ItemEvent
            java.awt.event.TextEvent
        java.beans.PropertyChangeEvent
        javax.swing.event.CaretEvent
        javax.swing.event.ChangeEvent
        javax.swing.event.HyperlinkEvent
        javax.swing.event.ListDataEvent
        javax.swing.event.ListSelectionEvent
        javax.swing.event.MenuEvent
        javax.swing.event.PopupMenuEvent
        javax.swing.event.TableColumnModelEvent
        javax.swing.event.TableModelEvent
        javax.swing.event.TreeExpansionEvent
        javax.swing.event.TreeModelEvent
        javax.swing.event.TreeSelectionEvent
        javax.swing.event.UndoableEditEvent

Components and the Events They Fire

ComponentEvents GeneratedReason
ComponentComponentEventComponent moved, resized, hidden or shown
FocusEventComponent gained or lost focus
KeyEventUser pressed or released a key
MouseEventMouse entered or exited component, or user pressed or released a mouse button in the component, or moved or dragged the mouse over the component.
InputMethodEventChange occured to caret position or text within the component
HierarchyEventThe hierarchy to which this component belongs changed, or an ancestor was moved or resized
PropertyChangeEventA bound property was changed
ContainerContainerEventComponent was added to or removed from the container
JComponentProperyChangeEventA bound or constrained property was changed
AncestorEventAn ancestor has been moved or resized, or the component or its ancestors are added or removed from the containment hierarchy
AbstractButtonActionEventThe button was activated
ChangeEventButton state (armed, enabled, pressed, rollover, selected) has changed
ItemEventButton was selected or deselected
JButton--- 
JMenuItemMenuDragMouseEvent 
MenuKeyEvent 
JCheckBoxMenuItem--- 
JRadioButtonMenuItem--- 
JMenuMenuEventThe menu has been selected, deselected or canceled
JToggleButton--- 
JCheckBox--- 
JRadioButton--- 
JColorChooser--- 
JComboBoxActionEventThe user finishes making a selection
JFileChooserActionEvent?
JInternalFrameInternalFrameEventThe internal frame was activated, closed, is closing, deactivated, deiconified, iconified, or opened
JLabel--- 
JLayeredPane--- 
JDesktopPane--- 
JListListSelectionEventThe value of the selection has changed
JMenuBar--- 
JOptionPane--- 
JPanel--- 
JPopupMenuPopupMenuEventThe popup menu is about to become visible or invisible, or has been canceled
JProgressBarChangeEventThe state changed
JRootPane--- 
JScrollBarAdjustmentEventThe value changed
JScrollPane--- 
JSeparator--- 
JSliderChangeEventThe state changed
JSplitPane--- 
JTable--- 
JTableHeader--- 
JTextComponentCaretEventThe caret position was updated
JEditorPaneHyperlinkEventA hyperlink was updated
JTextPane--- 
JTextArea--- 
JTextFieldActionEventUser hit Enter while the textfield had focus
JToolBar--- 
JToolTip--- 
JTreeTreeExpansionEventAn item in the tree has, or is about to be, expanded or collapsed
TreeSelectionEventThe value of the selection changed
JViewportChangeEventThe view's size, position or extent has changed

Models and the Events They Fire

When models are changed they fire events...

NOT DONE YET

Listeners

For the most part, there is almost a one-to-one mapping between events and listeners. But not quite. Here is the hierarchy of event listener interfaces:

java.util.EventListener
    java.awt.event.ActionListener
    java.awt.event.AdjustmentListener
    javax.swing.event.AncestorListener
    java.awt.event.AWTEventListener
    javax.swing.event.CaretListener
    javax.swing.event.CellEditorListener
    javax.swing.event.ChangeListener
    java.awt.event.ComponentListener
    java.awt.event.ContainerListener
    javax.swing.event.DocumentListener
    java.awt.event.FocusListener
    java.awt.event.HierarchyBoundsListener
    java.awt.event.HierarchyListener
    javax.swing.event.HyperlinkListener
    java.awt.event.InputMethodListener
    java.awt.event.ItemListener
    javax.swing.event.InternalFrameListener
    java.awt.event.KeyListener
    javax.swing.event.ListDataListener
    javax.swing.event.ListSelectionListener
    javax.swing.event.MenuDragMouseListener
    javax.swing.event.MenuKeyListener
    javax.swing.event.MenuListener
    java.awt.event.MouseListener
        javax.swing.event.MouseInputListener (also extends MouseMotionListener)
    java.awt.event.MouseMotionListener
        javax.swing.event.MouseInputListener (also extends MouseListener)
    javax.swing.event.PopupMenuListener
    java.beans.PropertyChangeListener
    javax.swing.event.TableColumnModelListener
    javax.swing.event.TableModelListener
    java.awt.event.TextListener
    javax.swing.event.TreeExpansionListener
    javax.swing.event.TreeModelListener
    javax.swing.event.TreeSelectionListener
    javax.swing.event.TreeWillExpandListener
    javax.swing.event.UndoableEditListener
    java.awt.event.WindowListener

Component Details - NOWHERE NEAR FINISHED

JLabel Models:
UIDelegates: javax.swing.plaf.basic.LabelUI
Renderers:
Editors:
Events Fired: PropertyChangeEvent
Replacement For: java.awt.Label
JButton Models: javax.swing.ButtonModel
UIDelegates: javax.swing.plaf.basic.ButtonUI
Renderers:
Editors:
Events Fired: ActionEvent, ChangeEvent, ItemEvent
Replacement For: java.awt.Button
JToggleButton Models:
UIDelegates:
Renderers:
Editors:
Events Fired:
Replacement For:
JCheckBox Models:
UIDelegates:
Renderers:
Editors:
Events Fired:
Replacement For:
JRadioButton Models:
UIDelegates:
Renderers:
Editors:
Events Fired:
Replacement For:
JMenuItem Models:
UIDelegates:
Renderers:
Editors:
Events Fired:
Replacement For:
JCheckBoxMenuItem Models:
UIDelegates:
Renderers:
Editors:
Events Fired:
Replacement For:
JRadioButtonMenuItem Models:
UIDelegates:
Renderers:
Editors:
Events Fired:
Replacement For:
JMenu Models:
UIDelegates:
Renderers:
Editors:
Events Fired:
Replacement For:
JPopupMenu Models:
UIDelegates:
Renderers:
Editors:
Events Fired:
Replacement For:
JMenuBar Models:
UIDelegates:
Renderers:
Editors:
Events Fired:
Replacement For:
JToolBar Models:
UIDelegates:
Renderers:
Editors:
Events Fired:
Replacement For:
JProgressBar Models:
UIDelegates:
Renderers:
Editors:
Events Fired:
Replacement For:
JSlider Models:
UIDelegates:
Renderers:
Editors:
Events Fired:
Replacement For:
JSeparator Models:
UIDelegates:
Renderers:
Editors:
Events Fired:
Replacement For:
JPanel Models:
UIDelegates:
Renderers:
Editors:
Events Fired:
Replacement For:
JRootPane Models:
UIDelegates:
Renderers:
Editors:
Events Fired:
Replacement For:
JLayeredPane Models:
UIDelegates:
Renderers:
Editors:
Events Fired:
Replacement For:
JTabbedPane Models:
UIDelegates:
Renderers:
Editors:
Events Fired:
Replacement For:
JSplitPane Models:
UIDelegates:
Renderers:
Editors:
Events Fired:
Replacement For:
JRootPane Models:
UIDelegates:
Renderers:
Editors:
Events Fired:
Replacement For:
JViewport Models:
UIDelegates:
Renderers:
Editors:
Events Fired:
Replacement For:
JScrollPane Models:
UIDelegates:
Renderers:
Editors:
Events Fired:
Replacement For:
JScrollBar Models:
UIDelegates:
Renderers:
Editors:
Events Fired:
Replacement For:
JWindow Models:
UIDelegates:
Renderers:
Editors:
Events Fired:
Replacement For:
JDialog Models:
UIDelegates:
Renderers:
Editors:
Events Fired:
Replacement For:
JOptionPane Models:
UIDelegates:
Renderers:
Editors:
Events Fired:
Replacement For:
JInternalFrame Models:
UIDelegates:
Renderers:
Editors:
Events Fired:
Replacement For:
JDesktopPane Models:
UIDelegates:
Renderers:
Editors:
Events Fired:
Replacement For:
JFileChooser Models:
UIDelegates:
Renderers:
Editors:
Events Fired:
Replacement For:
JColorChooser Models:
UIDelegates:
Renderers:
Editors:
Events Fired:
Replacement For:
JList Models:
UIDelegates:
Renderers:
Editors:
Events Fired:
Replacement For:
JComboBox Models:
UIDelegates:
Renderers:
Editors:
Events Fired:
Replacement For:
JTable Models:
UIDelegates:
Renderers:
Editors:
Events Fired:
Replacement For:
JTree Models:
UIDelegates:
Renderers:
Editors:
Events Fired:
Replacement For:
JTextField Models:
UIDelegates:
Renderers:
Editors:
Events Fired:
Replacement For:
JPasswordField Models:
UIDelegates:
Renderers:
Editors:
Events Fired:
Replacement For:
JTextArea Models:
UIDelegates:
Renderers:
Editors:
Events Fired:
Replacement For:
JEditorPane Models:
UIDelegates:
Renderers:
Editors:
Events Fired:
Replacement For:
JTextPane Models:
UIDelegates:
Renderers:
Editors:
Events Fired:
Replacement For: