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.
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.
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.
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
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.
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.
| ListModel | JList |
| ComboBoxModel | JComboBox |
| ButtonModel | JButton, JToggleButton, JCheckBox, JRadioButton, JMenu, JMenuItem, JCheckBoxMenuItem, JRadioButtonMenuItem |
| Document | JTextField, JPasswordField, JTextArea, JEditorPane, JTextPane |
| BoundedRangeModel | JProgressBar, JScrollBar, JSlider |
| SingleSelectionModel | JMenuBar, JPopupMenu, JTabbedPane |
| TableModel | JTable |
| TableColumnModel | JTable |
| TreeModel | JTree |
| TreeSelectionModel | JTree |
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
| Component | Events Generated | Reason |
|---|---|---|
| Component | ComponentEvent | Component moved, resized, hidden or shown |
| FocusEvent | Component gained or lost focus | |
| KeyEvent | User pressed or released a key | |
| MouseEvent | Mouse entered or exited component, or user pressed or released a mouse button in the component, or moved or dragged the mouse over the component. | |
| InputMethodEvent | Change occured to caret position or text within the component | |
| HierarchyEvent | The hierarchy to which this component belongs changed, or an ancestor was moved or resized | |
| PropertyChangeEvent | A bound property was changed | |
| Container | ContainerEvent | Component was added to or removed from the container |
| JComponent | ProperyChangeEvent | A bound or constrained property was changed |
| AncestorEvent | An ancestor has been moved or resized, or the component or its ancestors are added or removed from the containment hierarchy | |
| AbstractButton | ActionEvent | The button was activated |
| ChangeEvent | Button state (armed, enabled, pressed, rollover, selected) has changed | |
| ItemEvent | Button was selected or deselected | |
| JButton | --- | |
| JMenuItem | MenuDragMouseEvent | |
| MenuKeyEvent | ||
| JCheckBoxMenuItem | --- | |
| JRadioButtonMenuItem | --- | |
| JMenu | MenuEvent | The menu has been selected, deselected or canceled |
| JToggleButton | --- | |
| JCheckBox | --- | |
| JRadioButton | --- | |
| JColorChooser | --- | |
| JComboBox | ActionEvent | The user finishes making a selection |
| JFileChooser | ActionEvent | ? |
| JInternalFrame | InternalFrameEvent | The internal frame was activated, closed, is closing, deactivated, deiconified, iconified, or opened |
| JLabel | --- | |
| JLayeredPane | --- | |
| JDesktopPane | --- | |
| JList | ListSelectionEvent | The value of the selection has changed |
| JMenuBar | --- | |
| JOptionPane | --- | |
| JPanel | --- | |
| JPopupMenu | PopupMenuEvent | The popup menu is about to become visible or invisible, or has been canceled |
| JProgressBar | ChangeEvent | The state changed |
| JRootPane | --- | |
| JScrollBar | AdjustmentEvent | The value changed |
| JScrollPane | --- | |
| JSeparator | --- | |
| JSlider | ChangeEvent | The state changed |
| JSplitPane | --- | |
| JTable | --- | |
| JTableHeader | --- | |
| JTextComponent | CaretEvent | The caret position was updated |
| JEditorPane | HyperlinkEvent | A hyperlink was updated |
| JTextPane | --- | |
| JTextArea | --- | |
| JTextField | ActionEvent | User hit Enter while the textfield had focus |
| JToolBar | --- | |
| JToolTip | --- | |
| JTree | TreeExpansionEvent | An item in the tree has, or is about to be, expanded or collapsed |
| TreeSelectionEvent | The value of the selection changed | |
| JViewport | ChangeEvent | The view's size, position or extent has changed |
When models are changed they fire events...
NOT DONE YET
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
| 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: |