This document discusses the evolution of graphical user interface (GUI) capabilities in the Java programming language. It describes the Abstract Window Toolkit (AWT) introduced in JDK 1.0, which provided basic cross-platform GUI functionality but had limitations. JDK 1.1 improved on AWT with an event delegation model. JDK 1.2 introduced Swing, a richer GUI library that better integrated with native operating system look and feels. Swing components are lightweight compared to heavyweight AWT components. The document also covers GUI component classes, layout managers, menus, labels and event handling in Java GUI programming.
1. GUI
in
Java
AWT
and
Swing
• Most
GUI
class
libraries
in
C++
are
pla=orm
specific
– Different
hardware
capabiliCes
– Subtle
differences
between
the
"look-‐and-‐feel"
of
various
Windowing
operaCng
systems
• Abstract
Window
Toolkit
(AWT)
is
cross-‐pla=orm
– Swing
can
observe
various
OS
look-‐and-‐feel
convenCons
2. JDK
1.0
(circa
1996)
• JDK
1.0
went
a
long
way
to
implemenCng
pla=orm-‐independent
GUI
library
• Bruce
Eckel:
it
"produced
a
GUI
that
looks
equally
mediocre
on
all
systems."
– Just
4
fonts
– Couldn’t
access
GUI
of
naCve
OS
– Didn’t
separate
model
and
UI
code
cleanly
3. JDK
1.1
(circa
1998)
• JDK
1.1
makes
AWT
more
robust
and
extensible
• DelegaCon-‐based
event
model
separates
user
interface
from
problem
domain
– Designates
"listeners"
of
events
triggered
by
problem
domain
objects
– Listeners
implement
the
Observer
design
paern
• Other
enhancements:
buon
tool
Cps,
cut/paste
to
the
clipboard,
popup
menus,
prinCng,
etc.
– Adds
supports
for
JavaBeans
4. JDK
1.2
(Swing)
• JDK
1.2
adds
Java
FoundaCon
Classes
– Swing
is
the
GUI
library
for
JDK
1.2
– Much
richer
class
library
plus
beer
integraCon
with
look
and
feel
of
GUI
of
OS
– Eckel:
"The
‘revision
3’
rule
of
sobware
industry
(a
product
isn’t
good
unCl
revision
3)
seems
to
hold
true
with
programming
languages
as
well."
8. Component
and
Container
• Component
contributes
several
public
methods
to
all
its
subclasses:
public void setSize(int width, int height);
//set size in pixels
public void setBackground(Color c);
//see class Color for colors
public void setVisible(boolean b);
//Display on screen (creates peer)
• Container
is
an
abstract
class:
– It
cannot
be
instanCated;
subclasses
must
implement
some
methods
– Container
does
implement
some
useful
methods,
including:
public Component add(Component comp);
//put a Component in a Container
public setLayout(LayoutManager mgr);
//lay out components in some pattern
9. Window
and
Frame
classes
• A
Window
is
a
top-‐level
window
with
no
borders
and
no
menubar
– It
can
generate
a
WindowOpened
or
a
WindowClosed
event,
to
which
a
WindowListener
or
WindowAdapter
can
respond
• A
Frame
is
a
top-‐level
window
with
a
Ctle
and
a
border
• Because
it
has
more
features,
it
can
generate
more
events:
WindowOpened, WindowClosing, WindowClosed,
WindowIconified, WindowDeiconified,
WindowActivated, WindowDeactivated
• Respond
to
these
events
with
a
WindowListener
• Once
a
subclass
of
Container
has
been
constructed,
it
can
add
(aach)
any
AWT
component
within
it,
such
as
a
Buon,
Label,
TextField,
or
another
Frame
or
Panel
11. A
simple
example
//Demonstrates construction of a Container and a Button
import java.awt.*;
class Gui extends Frame
{
public Gui(String s) //constructor
{ super(s); //construct Frame part of Gui
setBackground(Color.yellow);
setLayout(new FlowLayout());
Button pushButton = new Button("press me");
add(pushButton);
}
} //class Gui
class Ex_1 //Creates an instance of class Gui
{ public static void main(String[] args)
{ Gui screen = new Gui("Example 1");
screen.setSize(500,100);
screen.setVisible(true);
}
} //class Ex_1
12. Responding
to
events
//Program to demonstrate action listeners and event handlers
import java.awt.*;
import java.awt.event.*;
class Gui extends Frame implements ActionListener, WindowListener
{ public Gui(String s) //constructor
{ super(s);
setBackground(Color.yellow);
setLayout(new FlowLayout());
addWindowListener(this); //listen for events on this Window
Button pushButton = new Button("press me");
add(pushButton);
pushButton.addActionListener(this); //listen for Button press
}
//define action for Button press
public void actionPerformed(ActionEvent event)
{ final char bell = 'u0007';
if (event.getActionCommand().equals("press me"))
{ System.out.print(bell); }
}
//define methods in WindowListener interface
public void windowClosing(WindowEvent event) { System.exit(0); }
public void windowClosed(WindowEvent event) {} //do nothing
public void windowDeiconified(WindowEvent event){}
public void windowIconified(WindowEvent event){}
public void windowActivated(WindowEvent event){}
public void windowDeactivated(WindowEvent event){}
public void windowOpened(WindowEvent event){}
}
13. Responding
to
events,
conCnued
• Uses
event
delegaCon
model
of
JDK
1.1
• When
an
event
occurs,
it
generates
an
ActionEvent
object
– ActionListener
interface
listens
for
a
parCcular
ActionEvent
– Responds
in
its
actionPerformed
method
• WindowListener
interface
observes
events
triggered
by
Window
object,
such
as
closing
it,
and
responds
in
corresponding
methods
• Program
now
has
a
live
Buon:
actionPerformed
method
rings
a
bell
– Also
a
live
close
window
buon,
which
performs
System.exit(0)
• Most
Components
in
the
AWT
have
corresponding
Listeners
14. Adapter
Classes
• Time
consuming
to
define
all
interface
methods
– WindowListener
has
seven
methods
• What
if
we
only
want
to
use
one?
• Required
to
define
all
methods
in
interface
• Adapter
class
implements
an
interface
• Does
anyone
recognize
a
design
paern
here?
• Default
implementaCon
({
},
empty
body)
for
all
methods
– You
then
extend
adapter
class,
• overriding
methods
for
events
you
care
about,
such
as
windowClosing.
– Has
"is
a"
relaConship
with
interface
• WindowAdapter
is
a
WindowListener
• MouseAdapter
is
a
MouseListener
15. Layout
managers
Ø JDK provides a set of generic layout manager classes
FlowLayout (the default) add components one after another in rows:
setLayout(new FlowLayout(FlowLayout.LEFT,10,10);
for (int counter=1; counter <= 6; counter++)
add(new Button(String.valueOf(counter)));
1 2 3
4 5 6
GridLayout places components in cells of a grid:
setLayout(new GridLayout(3,2,5,5);
//3 rows, 2 columns, 5 pixel gaps
for (int counter=1; counter <= 6; counter++)
add(new Button(String.valueOf(counter)));
1 2
3 4
5 6
BorderLayout arranges components using along four sides
(North, South, East West) and Center positions
16. Swing
overview
• Defined
in
package
javax.swing
• Original
GUI
components
from
AWT
in
java.awt
– Heavyweight
components
-‐
rely
on
local
pla=orm's
windowing
system
for
look
and
feel
• Swing
components
are
lightweight
– Not
weighed
down
by
GUI
capabiliCes
of
pla=orm
– More
portable
than
heavyweight
components
• Swing
components
allow
programmer
to
specify
look
and
feel
– Can
change
depending
on
pla=orm
– Can
be
same
across
all
pla=orms
17. Swing
component
inheritance
hierarchy
java.awt.Component
java.awt.Container
java.lang.Object
javax.swing.JComponent
• Component defines methods used in its subclasses
(for example, paint and repaint)
• Container - collection of related components
• When using JFrame, add components to content pane
(a Container)
• JComponent - superclass to most Swing components
18. Jcomponent
features
• Pluggable
look
and
feel
– Can
look
like
different
pla=orms,
at
run-‐Cme
• Shortcut
keys
(mnemonics)
– Direct
access
to
components
through
keyboard
• Common
event
handling
– If
several
components
perform
same
acCons
• Tool
Cps
– Describe
component
when
mouse
rolls
over
it
19. Menus
Menu
Bar
– JMenuBar()
– add(
JMenu
)
Menu
– JMenu(
String
)
– add(
JMenuItem
)
JMenuItem( String )
JMenuItem( String,int )
JMenuBar mb = new JMenuBar(); //create a menu bar
JMenu fileMenu = new JMenu (“File”); //create a menu
mb.add( fileMenu ); //add menu to menu bar
setMenuBar( mb ); // add a menu bar to frame
fileMenu.setMnemonic( KeyEvent.VK_F ); // add a hotkey to menu
JMenuItem miOpen = new JMenuItem( “Open...”, KeyEvent.VK_O );
JMenuItem miExit = new JMenuItem( “Exit” );
fileMenu.add( miOpen ); // add a menu item
fileMenu.addSeparator(); // add a menu separator
fileMenu.add( miExit );
20. JLabel
• Labels
– Provide
text
instrucCons
on
a
GUI
– Read-‐only
text
– Programs
rarely
change
a
label's
contents
– Class
JLabel
(subclass
of
JComponent)
• Methods
– Can
declare
label
text
in
constructor
– myLabel.setToolTipText( "Text" )
• Displays
"Text" in
a
tool
Cp
when
mouse
over
label
– myLabel.setText( "Text" )
– myLabel.getText()
21. JLabel
• Icon
– Object
that
implements
interface
Icon
– One
class
is
ImageIcon
(.gif
and
.jpeg
images)
24 Icon bug = new ImageIcon( "bug1.gif" );
• Assumed
same
directory
as
program
– Display
an
icon
with
JLabel’s
setIcon
method
33 label3.setIcon( bug );
• myLabel.setIcon( myIcon );
• myLabel.getIcon //returns current Icon
22. 1 // Fig. 12.4: LabelTest.java
2 // Demonstrating the JLabel class.
3 import javax.swing.*;
4 import java.awt.*;
5 import java.awt.event.*;
6
7 public class LabelTest extends JFrame {
8 private JLabel label1, label2, label3;
9
10 public LabelTest()
11 {
12 super( "Testing JLabel" );
13
14 Container c = getContentPane();
15 c.setLayout( new FlowLayout() );
16
17 // JLabel constructor with a string argument
18 label1 = new JLabel( "Label with text" );
19 label1.setToolTipText( "This is label1" );
20 c.add( label1 );
21
22 // JLabel constructor with string, Icon and
23 // alignment arguments
24 Icon bug = new ImageIcon( "bug1.gif" );
25 label2 = new JLabel( "Label with text and icon",
26 bug, SwingConstants.LEFT );
27 label2.setToolTipText( "This is label2" );
28 c.add( label2 );
29
Create a Container object, to which we attach
JLabel objects (subclass of JComponent).
Initialize text in JLabel constructor.
Set the tool tip text, and attach
component to Container c.
Create a new ImageIcon (assumed to be
in same directory as program).
Set ImageIcon and alignment
of text in JLabel constructor.
23. JBuon
• Methods
of
class
JButton
– Constructors
JButton myButton = new JButton( "Label" );
JButton myButton = new JButton( "Label", myIcon );
– setRolloverIcon( myIcon )
• Sets
image
to
display
when
mouse
over
buon
• Class
ActionEvent getActionCommand
• returns
label
of
buon
that
generated
event
Icon bug1 = new ImageIcon( "bug1.gif" );
fancyButton = new JButton( "Fancy Button", bug1 );
fancyButton.setRolloverIcon( bug2 );
24. JCheckBox
• When
JCheckBox
changes
– ItemEvent
generated
• Handled
by
an
ItemListener,
which
must
define
itemStateChanged
– Register
handlers
with
with
addItemListener
private class CheckBoxHandler implements ItemListener {
• Class
public void itemStateChanged( ItemEvent e )
ItemEvent
– getStateChange
• Returns
ItemEvent.SELECTED
or
ItemEvent.DESELECTED
26. 31 italic.addItemListener( handler );
32
33 addWindowListener(
34 new WindowAdapter() {
35 public void windowClosing( WindowEvent e )
36 {
37 System.exit( 0 );
38 }
39 }
40 );
41
42 setSize( 275, 100 );
43 show();
44 }
45
46 public static void main( String args[] )
47 {
48 new CheckBoxTest();
49 }
50
51 private class CheckBoxHandler implements ItemListener {
52 private int valBold = Font.PLAIN;
53 private int valItalic = Font.PLAIN;
54
55 public void itemStateChanged( ItemEvent e )
56 {
57 if ( e.getSource() == bold )
58 if ( e.getStateChange() == ItemEvent.SELECTED )
59 valBold = Font.BOLD;
60 else
61 valBold = Font.PLAIN;
Because CheckBoxHandler implements
ItemListener, it must define method
itemStateChanged
getStateChange returns
ItemEvent.SELECTED or
ItemEvent.DESELECTED
27. JRadioButton
• Radio
buons
– Have
two
states:
selected
and
deselected
– Normally
appear
as
a
group
• Only
one
radio
buon
in
group
selected
at
Cme
• SelecCng
one
buon
forces
the
other
buons
off
– Mutually
exclusive
opCons
– ButtonGroup
-‐
maintains
logical
relaConship
between
radio
buons
• Class
JRadioButton
– Constructor
• JRadioButton( "Label", selected )
• If
selected
true,
JRadioButton
iniCally
selected
28. 1 // Fig. 12.12: RadioButtonTest.java
2 // Creating radio buttons using ButtonGroup and JRadioButton.
3 import java.awt.*;
4 import java.awt.event.*;
5 import javax.swing.*;
6
7 public class RadioButtonTest extends JFrame {
8 private JTextField t;
9 private Font plainFont, boldFont,
10 italicFont, boldItalicFont;
11 private JRadioButton plain, bold, italic, boldItalic;
12 private ButtonGroup radioGroup;
13
14 public RadioButtonTest()
15 {
16 super( "RadioButton Test" );
17
18 Container c = getContentPane();
19 c.setLayout( new FlowLayout() );
1.
import
20
21 t = new JTextField( "Watch the font style change", 25 );
22 c.add( t );
23
24 // Create radio buttons
25 plain = new JRadioButton( "Plain", true );
26 c.add( plain );
27 bold = new JRadioButton( "Bold", false);
28 c.add( bold );
29 italic = new JRadioButton( "Italic", false );
30 c.add( italic );
Initialize radio buttons. Only
one is initially selected.
1.1
DeclaraCons
1.2
IniCalizaCon
29. 31 boldItalic = new JRadioButton( "Bold/Italic", false );
32 c.add( boldItalic );
33
34 // register events
35 RadioButtonHandler handler = new RadioButtonHandler();
36 plain.addItemListener( handler );
37 bold.addItemListener( handler );
38 italic.addItemListener( handler );
39 boldItalic.addItemListener( handler );
40
41 // create logical relationship between JRadioButtons
42 radioGroup = new ButtonGroup();
43 radioGroup.add( plain );
44 radioGroup.add( bold );
45 radioGroup.add( italic );
46 radioGroup.add( boldItalic );
47
48 plainFont = new Font( "TimesRoman", Font.PLAIN, 14 );
49 boldFont = new Font( "TimesRoman", Font.BOLD, 14 );
50 italicFont = new Font( "TimesRoman", Font.ITALIC, 14 );
51 boldItalicFont =
52 new Font( "TimesRoman", Font.BOLD + Font.ITALIC, 14 );
53 t.setFont( plainFont );
54
55 setSize( 300, 100 );
56 show();
57 }
58
Create a ButtonGroup. Only
one radio button in the group may
be selected at a time.
Method add adds radio
buttons to the ButtonGroup
31. JList
• List
– Displays
series
of
items
– may
select
one
or
more
items
• Class
JList
– Constructor
JList( arrayOfNames )
• Takes
array
of
Objects
(Strings)
to
display
in
list
– setVisibleRowCount( n )
• Displays
n
items
at
a
Cme
• Does
not
provide
automaCc
scrolling
32. 30 // create a list with the items in the colorNames array
31 colorList = new JList( colorNames );
32 colorList.setVisibleRowCount( 5 );
33
34 // do not allow multiple selections
35 colorList.setSelectionMode(
36 ListSelectionModel.SINGLE_SELECTION );
37
38 // add a JScrollPane containing the JList
39 // to the content pane
40 c.add( new JScrollPane( colorList ) );
41
42 // set up event handler
43 colorList.addListSelectionListener(
44 new ListSelectionListener() {
45 public void valueChanged( ListSelectionEvent e )
46 {
47 c.setBackground(
48 colors[ colorList.getSelectedIndex() ] );
49 }
50 }
51 );
52
53 setSize( 350, 150 );
54 show();
55 }
56
57 public static void main( String args[] )
58 {
59 ListTest app = new ListTest();
Initialize JList with array of
Strings, and show 5 items at
a time.
Make the JList a single-selection
list.
Create a new JScrollPane
object, initialize it with a JList,
and attach it to the content pane.
Change the color according to the item
selected (use getSelectedIndex).
33. 1 // Fig. 12.20: MouseDetails.java
2 // Demonstrating mouse clicks and
3 // distinguishing between mouse buttons.
4 import javax.swing.*;
5 import java.awt.*;
6 import java.awt.event.*;
7
8 public class MouseDetails extends JFrame {
9 private String s = "";
10 private int xPos, yPos;
11
12 public MouseDetails()
13 {
14 super( "Mouse clicks and buttons" );
15
16 addMouseListener( new MouseClickHandler() );
17
18 setSize( 350, 150 );
19 show();
20 }
21
22 public void paint( Graphics g )
23 {
24 g.drawString( "Clicked @ [" + xPos + ", " + yPos + "]",
25 xPos, yPos );
26 }
27
Another example, illustrating
mouse events in AWT and Swing
Add a listener for a
mouse click.
34. 28 public static void main( String args[] )
29 {
30 MouseDetails app = new MouseDetails();
31
32 app.addWindowListener(
33 new WindowAdapter() {
34 public void windowClosing( WindowEvent e )
35 {
36 System.exit( 0 );
37 }
38 }
39 );
40 }
41
42 // inner class to handle mouse events
43 private class MouseClickHandler extends MouseAdapter {
44 public void mouseClicked( MouseEvent e )
45 {
46 xPos = e.getX();
47 yPos = e.getY();
48
49 String s =
50 "Clicked " + e.getClickCount() + " time(s)";
51
52 if ( e.isMetaDown() ) // Right mouse button
53 s += " with right mouse button";
54 else if ( e.isAltDown() ) // Middle mouse button
55 s += " with center mouse button";
56 else // Left mouse button
57 s += " with left mouse button";
58
Use a named inner class as the event handler. Can still
inherit from MouseAdapter (extends MouseAdapter).
Use getClickCount, isAltDown,
and isMetaDown to determine the
String to use.
35. 59 setTitle( s ); // set the title bar of the window
60 repaint();
61 }
Set the Frame’s title bar.
62 }
63 }
Program
Output
36. GUI
Builders
• Netbeans
(Sun)
• JBuilder
(Borland)
• Eclipse
(IBM
and
others)
– Visual
Editor
• Help
à
Sobware
Updates
à
Find
and
Install…