awt and swing

35
AWT and Swing AWT and Swing Most GUI class libraries in C++ are platform Most GUI class libraries in C++ are platform specific specific Different hardware capabilities Different hardware capabilities Subtle differences between the "look-and- Subtle differences between the "look-and- feel" of various Windowing operating systems. feel" of various Windowing operating systems. Java Abstract Window Toolkit (AWT) is cross- Java Abstract Window Toolkit (AWT) is cross- platform platform Observes look-and-feel conventions of various Observes look-and-feel conventions of various OS platforms. OS platforms.

Upload: hamal

Post on 12-Feb-2016

71 views

Category:

Documents


2 download

DESCRIPTION

AWT and Swing. Most GUI class libraries in C++ are platform specific Different hardware capabilities Subtle differences between the "look-and-feel" of various Windowing operating systems. Java Abstract Window Toolkit (AWT) is cross-platform - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: AWT and Swing

AWT and SwingAWT and Swing Most GUI class libraries in C++ are platform specificMost GUI class libraries in C++ are platform specific Different hardware capabilitiesDifferent hardware capabilities Subtle differences between the "look-and-feel" of various Subtle differences between the "look-and-feel" of various

Windowing operating systems. Windowing operating systems. Java Abstract Window Toolkit (AWT) is cross-platformJava Abstract Window Toolkit (AWT) is cross-platform Observes look-and-feel conventions of various OS platforms.Observes look-and-feel conventions of various OS platforms.

Page 2: AWT and Swing

Common functionality/specific implementation approachCommon functionality/specific implementation approach

Toolkit -------------------------------------------------- AWT Toolkit -------------------------------------------------- AWT -----------|-----------------------|------------Button         List                             JVM Button         List                             JVM

| | Native GUI | | Native GUI Button Peer  List Peer    (Windows, Mac, X)Button Peer  List Peer    (Windows, Mac, X)

AWT uses a "common functionality/specific implementation" approachAWT uses a "common functionality/specific implementation" approach AWT GUI classes are platform-independent elementsAWT GUI classes are platform-independent elements Each AWT platform-specific toolkit comes with peer class for each platform-Each AWT platform-specific toolkit comes with peer class for each platform-

independent class implementing platform-specific behavior of AWT classindependent class implementing platform-specific behavior of AWT class Combining platform-independent class with its platform-specific peer Combining platform-independent class with its platform-specific peer

transforms generic, abstract windows behavior into specific, particular transforms generic, abstract windows behavior into specific, particular behavior. behavior.

Page 3: AWT and Swing

Peer classes at run-timePeer classes at run-timeclass TestPeer class TestPeer { Frame myFrame = new Frame("my Frame");  //create window Frame{ Frame myFrame = new Frame("my Frame");  //create window Frame Button myButton = new Button("my Button"); //create myButton Button myButton = new Button("my Button"); //create myButton myFrame.add("Center",myButton);  //put myButton in myFramemyFrame.add("Center",myButton);  //put myButton in myFrame myFrame.setVisible(true); //button appears in window on screenmyFrame.setVisible(true); //button appears in window on screen //setVisible() creates peer objects for myFrame & myButton//setVisible() creates peer objects for myFrame & myButton ComponentPeer buttonPeer = myButton.getPeer(); //now worksComponentPeer buttonPeer = myButton.getPeer(); //now works} }

Code first creates a frame, then adds a button on the frame Code first creates a frame, then adds a button on the frame setVisible method creates peer objects on platformsetVisible method creates peer objects on platform Last line now accesses myButton’s peer objectLast line now accesses myButton’s peer object Peer classes are usually hidden from developers. Why? Peer classes are usually hidden from developers. Why? In fact, in newer versions of JDK, getPeer() method is "deprecated“In fact, in newer versions of JDK, getPeer() method is "deprecated“ Peer classes strongly discouraged for code maintenance purposes Peer classes strongly discouraged for code maintenance purposes

First, create a frame.Next, create a Button.

Attach (add) myButton to myFrame.

Now, peer objects exist.Note: getPeer() is now “deprecated.”

Set myFrame and myButton visible, by creating platform-specific peer objects.

Page 4: AWT and Swing

JDK 1.0 (circa 1996)JDK 1.0 (circa 1996)

JDK 1.0 went a long way to implementing JDK 1.0 went a long way to implementing platform-independent GUI libraryplatform-independent GUI library

Bruce Eckel: it "produced a GUI that looks Bruce Eckel: it "produced a GUI that looks equally mediocre on all systems." equally mediocre on all systems."

Just 4 fontsJust 4 fonts Couldn’t access GUI of native OS.Couldn’t access GUI of native OS. Didn’t separate model and UI code cleanly.Didn’t separate model and UI code cleanly.

Page 5: AWT and Swing

JDK 1.1 (circa 1998)JDK 1.1 (circa 1998) JDK 1.1 makes AWT more robust and extensible. JDK 1.1 makes AWT more robust and extensible. Delegation-based event model separates user Delegation-based event model separates user

interface from problem domain.interface from problem domain. Avoids cascaded if statements testing for object Avoids cascaded if statements testing for object

type required by first AWT.type required by first AWT. Designates "listeners" of events triggered by Designates "listeners" of events triggered by

problem domain objects.problem domain objects. Other enhancements: button tool tips, cut/paste Other enhancements: button tool tips, cut/paste

to the clipboard, popup menus, printing, mouse-to the clipboard, popup menus, printing, mouse-less operation, etc.less operation, etc.

Adds supports for Java Beans.Adds supports for Java Beans.

Page 6: AWT and Swing

JDK 1.2 (Swing)JDK 1.2 (Swing) JDK 1.2 adds Java Foundation Classes.JDK 1.2 adds Java Foundation Classes. Swing is the GUI library for JDK 1.2.Swing is the GUI library for JDK 1.2. Much richer class library plus better integration Much richer class library plus better integration

with look and feel of GUI of OS.with look and feel of GUI of OS. Eckel: "The ‘revision 3’ rule of software industry (a Eckel: "The ‘revision 3’ rule of software industry (a

product isn’t good until revision 3) seems to hold product isn’t good until revision 3) seems to hold true with programming languages as well." true with programming languages as well."

But browsers have been slow to include JDK 1.2.But browsers have been slow to include JDK 1.2.

Page 7: AWT and Swing

AWT class hierarchyAWT class hierarchy

Checkbox, Choice,Label, List,

Scrollbar,ScrollPane,TextArea, TextField

Page 8: AWT and Swing

Component and ContainerComponent and Container

ComponentComponent contributes several public methods to all its subclasses: contributes several public methods to all its subclasses: public void setSize(int width, int height);public void setSize(int width, int height);

//set size in pixels//set size in pixelspublic void setBackground(Color c); public void setBackground(Color c);

//see class Color for colors //see class Color for colors public void setVisible(boolean b); public void setVisible(boolean b); 

//Display on screen (creates peer)//Display on screen (creates peer)

ContainerContainer is an abstract class: is an abstract class: It cannot be instantiated; subclasses must implement some methods It cannot be instantiated; subclasses must implement some methods ContainerContainer does implement some useful methods, including: does implement some useful methods, including:

public Component add(Component comp);public Component add(Component comp);//put a Component in a Container//put a Component in a Containerpublic setLayout(LayoutManager mgr);  public setLayout(LayoutManager mgr);  //lay out components in some pattern //lay out components in some pattern

Page 9: AWT and Swing

Window and Frame classesWindow and Frame classes

A A WindowWindow object is a top-level window with no borders and no menubar object is a top-level window with no borders and no menubar It can generate a It can generate a WindowOpenedWindowOpened or a or a WindowClosedWindowClosed event, event,

to which a to which a WindowListenerWindowListener or or WindowAdapterWindowAdapter can respond can respond A A FrameFrame is a top-level window with a title and a border is a top-level window with a title and a border Because it has more features, it can generate more events: Because it has more features, it can generate more events:

WindowOpened, WindowClosing, WindowClosed,WindowOpened, WindowClosing, WindowClosed,WindowIconified, WindowDeiconified, WindowIconified, WindowDeiconified, WindowActivated, WindowDeactivatedWindowActivated, WindowDeactivated

Respond to these events with a Respond to these events with a WindowListenerWindowListener or or WindowListenerWindowListener Once a subclass of Container has been constructed, Once a subclass of Container has been constructed,

it can invoke an add method to attach any AWT component within it,it can invoke an add method to attach any AWT component within it,such as a Button or a Label or a TextField or another Frame or Panel. such as a Button or a Label or a TextField or another Frame or Panel.

Page 10: AWT and Swing

A simple exampleA simple example//Demonstrates construction of a Container and a Button//Demonstrates construction of a Container and a Buttonimport java.awt.*; import java.awt.*; class Gui extends Frameclass Gui extends Frame{ {

public Gui(String s) public Gui(String s) //constructor//constructor { super(s);    { super(s);    //construct Frame part of Gui//construct Frame part of Gui setBackground(Color.yellow);setBackground(Color.yellow); setLayout(new FlowLayout());setLayout(new FlowLayout()); Button pushButton = new Button("press me");Button pushButton = new Button("press me"); add(pushButton); add(pushButton); } } } //class Gui } //class Gui class Ex_1 class Ex_1 //Creates an instance of class //Creates an instance of class

GuiGui{ public static void main(String[] args) { public static void main(String[] args) { Gui screen = new Gui("Example 1");{ Gui screen = new Gui("Example 1"); screen.setSize(500,100);screen.setSize(500,100); screen.setVisible(true);screen.setVisible(true); }}} //class Ex_1 } //class Ex_1

Superclass does not most of the work of creating an instance of Gui. Modify properties of Gui.

Create a button and attach it to Gui.

Construct a Gui, set its size and make it visible.

What does this program not do?

Page 11: AWT and Swing

Responding to eventsResponding to events//Program to demonstrate action listeners and event handlers //Program to demonstrate action listeners and event handlers import java.awt.*; import java.awt.*; import java.awt.event.*; import java.awt.event.*; class Gui extends Frame implements ActionListener, WindowListenerclass Gui extends Frame implements ActionListener, WindowListener{ public Gui(String s) //constructor { public Gui(String s) //constructor { super(s);{ super(s); setBackground(Color.yellow); setBackground(Color.yellow); setLayout(new FlowLayout());setLayout(new FlowLayout()); addWindowListener(this);      //listen for events on this Window addWindowListener(this);      //listen for events on this Window Button pushButton = new Button("press me");Button pushButton = new Button("press me"); add(pushButton);add(pushButton); pushButton.addActionListener(this); //listen for Button press pushButton.addActionListener(this); //listen for Button press } } //define action for Button press//define action for Button press public void actionPerformed(ActionEvent event)public void actionPerformed(ActionEvent event) { final char bell = '\u0007'; { final char bell = '\u0007'; if (event.getActionCommand().equals("press me"))if (event.getActionCommand().equals("press me")) { System.out.print(bell); }{ System.out.print(bell); } } } //define methods in WindowListener interface//define methods in WindowListener interface public void windowClosing(WindowEvent event) { System.exit(0); } public void windowClosing(WindowEvent event) { System.exit(0); } public void windowClosed(WindowEvent event) {} //do nothingpublic void windowClosed(WindowEvent event) {} //do nothing public void windowDeiconified(WindowEvent event){} public void windowDeiconified(WindowEvent event){} public void windowIconified(WindowEvent event){} public void windowIconified(WindowEvent event){} public void windowActivated(WindowEvent event){} public void windowActivated(WindowEvent event){} public void windowDeactivated(WindowEvent event){} public void windowDeactivated(WindowEvent event){} public void windowOpened(WindowEvent event){} public void windowOpened(WindowEvent event){} }}

Attach a observer to “listen” for events that might occur on this window.Create a simple button,

then add it to the Gui Frame.Attach an observer to listen to events on this button.

Listen for these events that can occur on a Window.

When the ActionEvent labeled "press me""press me" occurs, print (ring) the bell.

Page 12: AWT and Swing

Responding to events, continuedResponding to events, continued

Uses event delegation model of JDK 1.1 Uses event delegation model of JDK 1.1 When an event occurs, it generates an When an event occurs, it generates an ActionEventActionEvent object. object. ActionListenerActionListener interface listens for a particular interface listens for a particular ActionEventActionEvent..

Responds in its Responds in its actionPerformedactionPerformed method. method. WindowListenerWindowListener interface observes events triggered by interface observes events triggered by WindowWindow object, such as closing it, and responds in object, such as closing it, and responds in corresponding methods.corresponding methods.

Program now has a live Button: Program now has a live Button: actionPerformedactionPerformed method method rings a bell.rings a bell.

Also a live close window button, which performs Also a live close window button, which performs System.exit(0)System.exit(0)..

Most Components in the AWT have corresponding Listeners. Most Components in the AWT have corresponding Listeners.

Page 13: AWT and Swing

Adapter ClassesAdapter Classes Time consuming to define all interface methodsTime consuming to define all interface methods

WindowListenerWindowListener has seven methods has seven methods• What if we only want to use one?What if we only want to use one?• Required to define all methods in interfaceRequired to define all methods in interface

Adapter classAdapter class Implements an interface Implements an interface

• Default implementation ({ }, empty body) for all methodsDefault implementation ({ }, empty body) for all methods You then extend adapter class, You then extend adapter class,

• overriding methods for events you care about, such as overriding methods for events you care about, such as windowClosingwindowClosing. .

Has "is a" relationship with interfaceHas "is a" relationship with interface• WindowAdapterWindowAdapter is a is a WindowListenerWindowListener• MouseAdapterMouseAdapter is a is a MouseListenerMouseListener

Page 14: AWT and Swing

Sketchpad exampleSketchpad example See See Sketchpad.javaSketchpad.java

Page 15: AWT and Swing

Layout managersLayout managers Sketchpad uses hard-coded layout, which depends on a 800x600 screenSketchpad uses hard-coded layout, which depends on a 800x600 screenJDK provides a set of generic JDK provides a set of generic layout managerlayout manager classes classes

• Arrange Component objects within a Container object in predictable waysArrange Component objects within a Container object in predictable waysFlowLayout (the default) add components one after another in rows:FlowLayout (the default) add components one after another in rows:

setLayout(new FlowLayout(FlowLayout.LEFT,10,10); setLayout(new FlowLayout(FlowLayout.LEFT,10,10); for (int counter=1; counter <= 6; counter++) for (int counter=1; counter <= 6; counter++) add(new Button(String.valueOf(counter)));add(new Button(String.valueOf(counter)));

1    2    3 1    2    3 4    5    64    5    6

GridLayout places components in cells of a grid: GridLayout places components in cells of a grid:

setLayout(new GridLayout(3,2,5,5); setLayout(new GridLayout(3,2,5,5); //3 rows, 2 columns, 5 pixel gaps//3 rows, 2 columns, 5 pixel gapsfor (int counter=1; counter <= 6; counter++) for (int counter=1; counter <= 6; counter++)    add(new Button(String.valueOf(counter)));   add(new Button(String.valueOf(counter)));

1        2 1        2 3        43        45        65        6

BorderLayout arranges components using along four sides BorderLayout arranges components using along four sides (North, South, East West) and Center positions(North, South, East West) and Center positions

Page 16: AWT and Swing

Swing overviewSwing overview Defined in package Defined in package javax.swingjavax.swing

Original GUI components from Abstract Windowing Toolkit in Original GUI components from Abstract Windowing Toolkit in java.awtjava.awt Heavyweight components - rely on local platform's windowing system Heavyweight components - rely on local platform's windowing system

for look and feelfor look and feel

Swing components are lightweightSwing components are lightweight Written in Java, not weighed down by GUI capabilities of platformWritten in Java, not weighed down by GUI capabilities of platform More portable than heavyweight componentsMore portable than heavyweight components

Swing components allow programmer to specify look and feelSwing components allow programmer to specify look and feel Can change depending on platformCan change depending on platform Can be same across all platformsCan be same across all platforms

Page 17: AWT and Swing

Swing component inheritance hierarchySwing component inheritance hierarchy

java.awt.Component

java.awt.Container

java.lang.Object

javax.swing.JComponent

• Component defines methods that can be used in its subclasses(for example, paint and repaint)

• Container - collection of related components• When using JFrame, add components to the content pane (a Container)• JComponent - superclass to most Swing components• Much of a component's functionality inherited from these classes

Page 18: AWT and Swing

Jcomponent featuresJcomponent features

Some capabilities of subclasses of Some capabilities of subclasses of JComponentJComponent Pluggable look and feelPluggable look and feel Shortcut keys (mnemonics)Shortcut keys (mnemonics)

• Direct access to components through keyboardDirect access to components through keyboard Common event handlingCommon event handling

• If several components perform same actionsIf several components perform same actions Tool tipsTool tips

• Describe component when mouse rolls over itDescribe component when mouse rolls over it

Page 19: AWT and Swing

JLabelJLabel

LabelsLabels Provide text instructions on a GUIProvide text instructions on a GUI Read-only textRead-only text Programs rarely change a label's contentsPrograms rarely change a label's contents Class Class JLabelJLabel (subclass of (subclass of JComponentJComponent))

MethodsMethods Can declare label text in constructorCan declare label text in constructor myLabel.setToolTipText( "Text" )myLabel.setToolTipText( "Text" )

• Displays Displays "Text" "Text" in a tool tip when mouse over labelin a tool tip when mouse over label myLabel.setText( "Text" )myLabel.setText( "Text" ) myLabel.getText()myLabel.getText()

Page 20: AWT and Swing

JLabelJLabel

IconIcon Object that implements interface Object that implements interface IconIcon

One class is One class is ImageIconImageIcon ( (.gif.gif and and .jpeg.jpeg images) images)

• Assumed same directory as programAssumed same directory as program Display an icon with Display an icon with JLabelJLabel’s ’s setIconsetIcon method method

• myLabel.setIcon( myIcon );myLabel.setIcon( myIcon );• myLabel.getIcon //returns current IconmyLabel.getIcon //returns current Icon

24 Icon bug = new ImageIcon( "bug1.gif" );

33 label3.setIcon( bug );

Page 21: AWT and Swing

1 // Fig. 12.4: LabelTest.java2 // Demonstrating the JLabel class.3 import javax.swing.*;4 import java.awt.*;5 import java.awt.event.*;67 public class LabelTest extends JFrame {8 private JLabel label1, label2, label3;910 public LabelTest()11 {12 super( "Testing JLabel" );131414 Container c = getContentPane();15 c.setLayout( new FlowLayout() );1617 // JLabel constructor with a string argument1818 label1 = new JLabel( "Label with text" );1919 label1.setToolTipText( "This is label1" );20 c.add( label1 );2122 // JLabel constructor with string, Icon and23 // alignment arguments2424 Icon bug = new ImageIcon( "bug1.gif" );2525 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.

Create a new ImageIcon (assumed to be in same directory as program).

Set ImageIcon and alignment of text in JLabel constructor.

Set the tool tip text, and attach component to Container c.

Page 22: AWT and Swing

JButtonJButton

Methods of class Methods of class JButtonJButton ConstructorsConstructorsJButton myButton = new JButton( "Label" );JButton myButton = new JButton( "Label" );JButton myButton = new JButton( "Label", myIcon );JButton myButton = new JButton( "Label", myIcon ); setRolloverIcon( myIcon )setRolloverIcon( myIcon )

• Sets image to display when mouse over buttonSets image to display when mouse over button Class Class ActionEvent getActionCommandActionEvent getActionCommand

• returns label of button that generated eventreturns label of button that generated event

Icon bug1 = new ImageIcon( "bug1.gif" );fancyButton = new JButton( "Fancy Button", bug1 );fancyButton.setRolloverIcon( bug2 );

Page 23: AWT and Swing

JCheckBoxJCheckBox When When JCheckBoxJCheckBox changes changes

ItemEventItemEvent generated generated • Handled by an Handled by an ItemListenerItemListener, which must define, which must define itemStateChangeditemStateChanged

Register handlers with with Register handlers with with addItemListeneraddItemListener

Class Class ItemEventItemEvent getStateChangegetStateChange

• Returns Returns ItemEvent.SELECTEDItemEvent.SELECTED or or ItemEvent.DESELECTEDItemEvent.DESELECTED

private class CheckBoxHandler implements ItemListener {public void itemStateChanged( ItemEvent e )

Page 24: AWT and Swing

1. 1. importimport

1.1 Declarations1.1 Declarations

1.2 Initialize 1.2 Initialize JCheckBoxJCheckBoxeses

1.3 Register event handler1.3 Register event handler

1 // Fig. 12.12: CheckBoxTest.java2 // Creating Checkbox buttons.3 import java.awt.*;4 import java.awt.event.*;5 import javax.swing.*;67 public class CheckBoxTest extends JFrame {8 private JTextField t;9 private JCheckBox bold, italic;1011 public CheckBoxTest()12 {13 super( "JCheckBox Test" );1415 Container c = getContentPane();16 c.setLayout(new FlowLayout());1718 t = new JTextField( "Watch the font style change", 20 );19 t.setFont( new Font( "TimesRoman", Font.PLAIN, 14 ) );20 c.add( t );2122 // create checkbox objects2323 bold = new JCheckBox( "Bold" );24 c.add( bold ); 2526 italic = new JCheckBox( "Italic" );27 c.add( italic );2829 CheckBoxHandler handler = new CheckBoxHandler();30 bold.addItemListener( handler );

Create JCheckBoxes

Page 25: AWT and Swing

31 italic.addItemListener( handler );3233 addWindowListener(34 new WindowAdapter() {35 public void windowClosing( WindowEvent e )36 {37 System.exit( 0 );38 }39 }40 );4142 setSize( 275, 100 );43 show();44 }4546 public static void main( String args[] )47 { 48 new CheckBoxTest();49 }505151 private class CheckBoxHandler implements ItemListener {52 private int valBold = Font.PLAIN;53 private int valItalic = Font.PLAIN;5455 public void itemStateChanged( ItemEvent e )56 {57 if ( e.getSource() == bold )5858 if ( e.getStateChange() == ItemEvent.SELECTED )59 valBold = Font.BOLD;60 else61 valBold = Font.PLAIN;

Because CheckBoxHandler implements ItemListener, it must define method itemStateChanged

getStateChange returns ItemEvent.SELECTED or ItemEvent.DESELECTED

Page 26: AWT and Swing

JRadioButtonJRadioButton Radio buttonsRadio buttons

Have two states: selected and deselectedHave two states: selected and deselected Normally appear as a groupNormally appear as a group

• Only one radio button in group selected at timeOnly one radio button in group selected at time• Selecting one button forces the other buttons offSelecting one button forces the other buttons off

Mutually exclusive optionsMutually exclusive options ButtonGroupButtonGroup - maintains logical relationship between - maintains logical relationship between

radio buttons radio buttons Class Class JRadioButtonJRadioButton

Constructor Constructor • JRadioButton( "Label", selected )JRadioButton( "Label", selected )• If selected If selected truetrue, , JRadioButtonJRadioButton initially selected initially selected

Page 27: AWT and Swing

1. 1. importimport

1.1 Declarations1.1 Declarations

1.2 Initialization1.2 Initialization

1 // Fig. 12.12: RadioButtonTest.java2 // Creating radio buttons using ButtonGroup and JRadioButton.3 import java.awt.*;4 import java.awt.event.*;5 import javax.swing.*;67 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;1314 public RadioButtonTest()15 {16 super( "RadioButton Test" );1718 Container c = getContentPane();19 c.setLayout( new FlowLayout() );2021 t = new JTextField( "Watch the font style change", 25 );22 c.add( t ); 2324 // Create radio buttons25 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.

Page 28: AWT and Swing

31 boldItalic = new JRadioButton( "Bold/Italic", false );32 c.add( boldItalic );3334 // register events35 RadioButtonHandler handler = new RadioButtonHandler();36 plain.addItemListener( handler );37 bold.addItemListener( handler );38 italic.addItemListener( handler );39 boldItalic.addItemListener( handler );4041 // create logical relationship between JRadioButtons4242 radioGroup = new ButtonGroup();4343 radioGroup.add( plain );44 radioGroup.add( bold );45 radioGroup.add( italic );46 radioGroup.add( boldItalic );4748 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 );5455 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

Page 29: AWT and Swing
Page 30: AWT and Swing

JListJList ListList

Displays series of itemsDisplays series of items may select one or moremay select one or more This section, discuss single-selection listsThis section, discuss single-selection lists

Class Class JListJList Constructor Constructor JList( arrayOfNames )JList( arrayOfNames )

• Takes array of Takes array of ObjectsObjects ( (StringStrings) to display in lists) to display in list setVisibleRowCount( n )setVisibleRowCount( n )

• Displays Displays nn items at a time items at a time• Does not provide automatic scrollingDoes not provide automatic scrolling

Page 31: AWT and Swing

30 // create a list with the items in the colorNames array3131 colorList = new JList( colorNames );32 colorList.setVisibleRowCount( 5 );33 34 // do not allow multiple selections3535 colorList.setSelectionMode(36 ListSelectionModel.SINGLE_SELECTION );3738 // add a JScrollPane containing the JList39 // to the content pane4040 c.add( new JScrollPane( colorList ) );4142 // set up event handler43 colorList.addListSelectionListener(44 new ListSelectionListener() {45 public void valueChanged( ListSelectionEvent e ) 46 {4747 c.setBackground(48 colors[ colorList.getSelectedIndex() ] );49 }50 }51 );5253 setSize( 350, 150 );54 show();55 }5657 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).

Page 32: AWT and Swing

1 // Fig. 12.20: MouseDetails.java2 // Demonstrating mouse clicks and3 // distinguishing between mouse buttons.4 import javax.swing.*;5 import java.awt.*;6 import java.awt.event.*;78 public class MouseDetails extends JFrame {9 private String s = "";10 private int xPos, yPos;1112 public MouseDetails()13 {14 super( "Mouse clicks and buttons" );1516 addMouseListener( new MouseClickHandler() ); 1718 setSize( 350, 150 );19 show();20 }2122 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.

Page 33: AWT and Swing

28 public static void main( String args[] )29 {30 MouseDetails app = new MouseDetails();3132 app.addWindowListener(33 new WindowAdapter() {34 public void windowClosing( WindowEvent e )35 {36 System.exit( 0 );37 }38 }39 );40 }4142 // inner class to handle mouse events4343 private class MouseClickHandler extends MouseAdapter {44 public void mouseClicked( MouseEvent e )45 {46 xPos = e.getX();47 yPos = e.getY();4849 String s =5050 "Clicked " + e.getClickCount() + " time(s)";51 52 if ( e.isMetaDown() ) // Right mouse button53 s += " with right mouse button";54 else if ( e.isAltDown() ) // Middle mouse button55 s += " with center mouse button";56 else // Left mouse button57 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.

Page 34: AWT and Swing

Program OutputProgram Output

5959 setTitle( s ); // set the title bar of the window60 repaint();61 }62 }63 }

Set the Frame’s title bar.

Page 35: AWT and Swing

Good and bad programming practices with AWTGood and bad programming practices with AWT

Separate user interface logic from "business logic" or modelSeparate user interface logic from "business logic" or model AWT 1.1 "listeners" designed for this purpose; inner classes facilitate it furtherAWT 1.1 "listeners" designed for this purpose; inner classes facilitate it further Separation.javaSeparation.java example illustrates this approach: example illustrates this approach: class BusinessLogic knows nothing about UI; class BusinessLogic knows nothing about UI; class Separation keeps track of all UI details and talks to BusinessLogicclass Separation keeps track of all UI details and talks to BusinessLogic

through its public interface.through its public interface.

        How is this design loosely coupled? How is this design loosely coupled?     How does it support reuse?     How does it support reuse?     How does it support legacy code?    How does it support legacy code?

Also note use of inner classes for all "listeners" nested within SeparationAlso note use of inner classes for all "listeners" nested within Separation Contrast code of Contrast code of badidea1.javabadidea1.java: look at code in actionPerformed: : look at code in actionPerformed:

public void actionPerformed(ActionEvent e) public void actionPerformed(ActionEvent e) { Object source = e.getSource();{ Object source = e.getSource();  if (source == b1)  if (source == b1)     System.out.println("Button 1 pressed");     System.out.println("Button 1 pressed");  else if (source == b2) System.out.println("Button 2 pressed");  else if (source == b2) System.out.println("Button 2 pressed");      else System.out.println("Something else");      else System.out.println("Something else");}}

badidea2.javabadidea2.java improves on things by using adapters, but ...    improves on things by using adapters, but ...    Why is the cascaded Why is the cascaded ifif above a bad idea? above a bad idea?