Look-and-Feel Observation 11.7
Buttons typically use tutorial-title capitalization.
A command button (see output of Screenshot) generates an ActionEvent when the user clicks the button. Command buttons are created with class JButton. The text on the face of a JButton is called a button label. A GUI can have many JButtons, but each button label typically should be unique in the portion of the GUI that is currently displayed.
1 // Fig. 11.15: ButtonFrame.java
2 // Creating JButtons.
3 import java.awt.FlowLayout;
4 import java.awt.event.ActionListener;
5 import java.awt.event.ActionEvent;
6 import javax.swing.JFrame;
7 import javax.swing.JButton;
8 import javax.swing.Icon;
9 import javax.swing.ImageIcon;
10 import javax.swing.JOptionPane;
11
12 public class ButtonFrame extends JFrame
13 {
14 private JButton plainJButton; // button with just text
15 private JButton fancyJButton; // button with icons
16
17 // ButtonFrame adds JButtons to JFrame
18 public ButtonFrame()
19 {
20 super( "Testing Buttons" );
21 setLayout( new FlowLayout() ); // set frame layout
22
23 plainJButton = new JButton( "Plain Button" ); // button with text
24 add( plainJButton ); // add plainJButton to JFrame
25
26 Icon bug1 = new ImageIcon( getClass().getResource( "bug1.gif" ) );
27 Icon bug2 = new ImageIcon( getClass().getResource( "bug2.gif" ) );
28 fancyJButton = new JButton( "Fancy Button", bug1 ); // set image
29 fancyJButton.setRolloverIcon( bug2 ); // set rollover image
30 add( fancyJButton ); // add fancyJButton to JFrame
31
32 // create new ButtonHandler for button event handling
33 ButtonHandler handler = new ButtonHandler();
34 fancyJButton.addActionListener( handler );
35 plainJButton.addActionListener( handler );
36 } // end ButtonFrame constructor
37
38 // inner class for button event handling
39 private class ButtonHandler implements ActionListener
40 {
41 // handle button event
42 public void actionPerformed( ActionEvent event )
43 {
44 JOptionPane.showMessageDialog( ButtonFrame.this, String.format(
45 "You pressed: %s", event.getActionCommand() ) );
46 } // end method actionPerformed
47 } // end private inner class ButtonHandler
48 } // end class ButtonFrame
Look-and-Feel Observation 11.8
Having more than one JButton with the same label makes the JButtons ambiguous to the user. Provide a unique label for each button.
The app of Screenshot and Screenshot creates two JButtons and demonstrates that JButtons support the display of Icons. Event handling for the buttons is performed by a single instance of inner class ButtonHandler (lines 3947).
1 // Fig. 11.16: ButtonTest.java
2 // Testing ButtonFrame.
3 import javax.swing.JFrame;
4
5 public class ButtonTest
6 {
7 public static void main( String args[] )
8 {
9 ButtonFrame buttonFrame = new ButtonFrame(); // create ButtonFrame
10 buttonFrame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
11 buttonFrame.setSize( 275, 110 ); // set frame size
12 buttonFrame.setVisible( true ); // display frame
13 } // end main
14 } // end class ButtonTest
Lines 1415 declare JButton variables plainButton and fancyButton. The corresponding objects are instantiated in the constructor. Line 23 creates plainButton with the button label "Plain Button". Line 24 adds the button to the JFrame. A JButton can display an Icon. To provide the user with an extra level of visual interaction with the GUI, a JButton can also have a rollover Iconan Icon that is displayed when the user positions the mouse over the button. The icon on the button changes as the mouse moves in and out of the button's area on the screen. Lines 2627 create two ImageIcon objects that represent the default Icon and rollover Icon for the JButton created at line 28. Both statements assume that the image files are stored in the same directory as the app (which is commonly the case for apps that use images). These image files have been provided for you.
Line 28 creates fancyButton with the text "Fancy Button" and the icon bug1. By default, the text is displayed to the right of the icon. Line 29 uses setRolloverIcon (inherited from class AbstractButton) to specify the image displayed on the button when the user positions the mouse over it. Line 30 adds the button to the JFrame. Look-and-Feel Observation 11.9
Because class AbstractButton supports displaying text and images on a button, all subclasses of AbstractButton also support displaying text and images.
Look-and-Feel Observation 11.10
Using rollover icons for JButtons provides users with visual feedback indicating that when they click the mouse while the cursor is positioned over the button, an action will occur.
JButtons, like JTextFields, generate ActionEvents that can be processed by any ActionListener object. Lines 3335 create an object of private inner class ButtonHandler and register it as the event handler for each JButton. Class ButtonHandler (lines 3947) declares actionPerformed to display a message dialog box containing the label for the button the user pressed. For a JButton event, ActionEvent method getActionCommand returns the label on the button.
When you execute this app and click one of its buttons, notice that the message dialog that appears is centered over the app's window. This occurs because the call to JOptionPane method showMessageDialog (lines 4445 of Screenshot) uses ButtonFrame.this rather than null as the first argument. When this argument is not null, it represents the so-called parent GUI component of the message dialog (in this case the app window is the parent component) and enables the dialog to be centered over that component when the dialog is displayed. ButtonFrame.this represents the this reference of the object of top-level class ButtonFrame. Software Engineering Observation 11.4
When used in an inner class, keyword this refers to the current inner-class object being manipulated. An inner-class method can use its outer-class object's this by preceding this with the outer-class name and a dot, as in ButtonFrame.this.