Chapter 19 – Graphical User Interfaces Chapter Goals To use layout managers to arrange user-interface components in a container To become familiar with common user-interface components, such as radio buttons, check boxes, and menus To build programs that handle events generated by user-interface components To browse the Java documentation effectively In this chapter, you will learn how to use the most common user-interface components in the Java Swing toolkit, search Java documentation and handle events for interactive graphical programs. Copyright © 2014 by John Wiley & Sons. All rights reserved. Page 2 Introduction A graphical user interface (GUI) presents a user-friendly mechanism for interacting with an application. Pronounced “GOO-ee” GUIs are built from GUI components. A GUI component is an object with which the user interacts via the mouse, the keyboard or another form of input, such as voice recognition. Here, you’ll learn about many of Java’s so-called Swing GUI components from the javax.swing package. Copyright © 2014 by John Wiley & Sons. All rights reserved. Page 3 IDE Support for GUI Design Many IDEs provide GUI design tools with which you can specify a component’s exact size and location in a visual manner by using the mouse. The IDE generates the GUI code for you. Though this greatly simplifies creating GUIs, each IDE generates this code differently. For this reason, we will write the GUI code by hand. Copyright © 2014 by John Wiley & Sons. All rights reserved. Page 4 Sample Demo Download Swingset3 application and run: download.java.net/javadesktop/swingset3/SwingSet3.jnlp This application is a nice way for you to browse through the various GUI components provided by Java’s Swing GUI APIs. Simply click a component name (e.g., JFrame, JTabbedPane, etc.) in the GUI Components area at the left of the window to see a demonstration of the GUI component in the right side of the window. The source code for each demo is shown in the text area at the bottom of the window. Copyright © 2014 by John Wiley & Sons. All rights reserved. Page 5 From: Java How To Program – Dietel & Dietel The menus, buttons and combo box are part of the application’s GUI. They enable you to interact with the application. Page 6 Simple GUI-Based Input/Output with JOptionPane Most applications you use on a daily basis use windows or dialog boxes (also called dialogs) to interact with the user. Dialog boxes are windows in which programs display important messages to the user or obtain information from the user. Java’s JOptionPane class (package javax.swing) provides prebuilt dialog boxes for both input and output. Dialogs are displayed by invoking static JOptionPane methods. Refer JavaDoc API Copyright © 2014 by John Wiley & Sons. All rights reserved. Page 7 Copyright © 2014 by John Wiley & Sons. All rights reserved. Page 8 Unlike Scanner, which can be used to input values of several types from the user at the keyboard, an input dialog can input only Strings. If the user clicks Cancel, showInputDialog returns null. null = result in centering message in screen result in centering message in parent component Programming Question Write a tester program Addition that takes two numbers as user input, calculate sum and display calculated sum. Use JOptionPane to get user input and display sum. Sample output is shown below: Copyright © 2014 by John Wiley & Sons. All rights reserved. Page 10 Answer Addition.java import javax.swing.JOptionPane; // program uses JOptionPane public class Addition { public static void main( String[] args ) { // obtain user input from JOptionPane input dialogs String firstNumber = JOptionPane.showInputDialog( "Enter first integer" ); String secondNumber = JOptionPane.showInputDialog( "Enter second integer" ); // convert String inputs to int values for use in a calculation int number1 = Integer.parseInt( firstNumber ); int number2 = Integer.parseInt( secondNumber ); int sum = number1 + number2; // add numbers // display result in a JOptionPane message dialog JOptionPane.showMessageDialog( null, "The sum is " + sum, "Sum of Two Integers", JOptionPane.PLAIN_MESSAGE ); } // end method main } // end class Addition Page 11 19.1 Layout Management Arranging components on the screen User-interface components are arranged by placing them in a Swing Container object: • Jframe, JPanel • JFrame = a heavy weight container used as the top-level window • JPanel = a light weight container used to organize GUI components Copyright © 2014 by John Wiley & Sons. All rights reserved. Page 12 Jfrrame Class Example empty JFrame window: import java.awt.*; import javax.swing.*; public class Frame1 { public static void main(String[] args) { JFrame f = new JFrame("My First Frame"); // Create Frame f.setSize(400,300); // Set size of frame f.setVisible(true); // Show the window } } Copyright © 2014 by John Wiley & Sons. All rights reserved. Page 13 Output: Copyright © 2014 by John Wiley & Sons. All rights reserved. Page 14 Example JFrame with a GUI object(Jlabel) added: import java.awt.*; import javax.swing.*; public class Frame2 { public static void main(String[] args) { JFrame f = new JFrame("My First GUI"); f.setSize(400,300); //create a label JLabel L = new JLabel("Hello World !"); //add label to frame f.getContentPane().add( L ); f.setVisible(true); } } Copyright © 2014 by John Wiley & Sons. All rights reserved. Page 15 Output: Copyright © 2014 by John Wiley & Sons. All rights reserved. Page 16 JPanel Class To display the JPanel, the JPanel must be added on to the JFrame !!! import java.awt.*; import javax.swing.*; public class Frame3 { public static void main(String[] args) { JFrame f = new JFrame("JFrame with a JPanel"); JLabel L = new JLabel("Hello World !"); JPanel P = new JPanel(); // Make a JLabel; // Make a JPanel; P.add(L); // Add lable L to JPanel P f.getContentPane().add(P); // Add panel P to JFrame f f.setSize(400,300); f.setVisible(true); } } Copyright © 2014 by John Wiley & Sons. All rights reserved. Page 17 Output: Copyright © 2014 by John Wiley & Sons. All rights reserved. Page 18 Layout Management Each container has a layout manager that directs the arrangement of its components Three useful layout managers are: 1) Border layout 2) Flow layout 3) Grid layout Components are added to a container which uses a layout manager to place them Copyright © 2014 by John Wiley & Sons. All rights reserved. Page 19 Jframe’s Content Pane A JFrame has a content pane which is a Container where you can add components Use the getContentPane method to get its reference Container contentPane = getContentPane(); Adding components: Add components to the content pane OR Add a container to the content pane, then add components to the container Copyright © 2014 by John Wiley & Sons. All rights reserved. Page 20 Jframe’s Content Pane (2) Frame Menu Bar Content Pane • Components • Container – Components Frame (with Title Bar) x Menu Bar (optional) Container Copyright © 2014 by John Wiley & Sons. All rights reserved. Content Pane Page 21 Flow Layout Components are added from left to right panel = new JPanel(); panel.add(rateLabel); panel.add(rateField); panel.add(button); panel.add(resultLabel); A JPanel uses flow layout by default Copyright © 2014 by John Wiley & Sons. All rights reserved. Page 22 Example: import java.awt.*; import javax.swing.*; public class FlowLayoutDemo { public static void main(String[] args) { JFrame f = new JFrame("FlowLayoutDemo"); JPanel p = new JPanel(); FlowLayout layout = new FlowLayout(); layout.setHgap(50); layout.setVgap(50); p.setLayout(layout); p.add(new p.add(new p.add(new p.add(new p.add(new p.add(new JLabel("One")); JLabel("Two")); JLabel("Three")); JLabel("Four")); JLabel("Five")); JLabel("Six")); f.getContentPane().add(p); f.setSize(300,300); f.setVisible(true); } } Page 23 Output: Copyright © 2014 by John Wiley & Sons. All rights reserved. Page 24 Border Layout Components are placed toward areas of a container NORTH, EAST, SOUTH, WEST, or CENTER Specify one when adding components The content pane of a JFrame uses border layout by default panel.setLayout(new BorderLayout()); panel.add(component, BorderLayout.NORTH); Copyright © 2014 by John Wiley & Sons. All rights reserved. Page 25 Example import java.awt.*; import javax.swing.*; public class BorderLayoutDemo { public static void main(String[] args) { JFrame f = new JFrame("BorderLayout Demo"); JPanel p = new JPanel(); BorderLayout layout = new BorderLayout(); p.setLayout(layout); p.add(new p.add(new p.add(new p.add(new p.add(new JButton("North"), BorderLayout.NORTH); JButton("South") , BorderLayout.SOUTH); JButton("West") , BorderLayout.WEST); JButton("East") , BorderLayout.EAST); JButton("Center") , BorderLayout.CENTER); f.getContentPane().add(p); f.setSize(500,500); f.setVisible(true); } } Copyright © 2014 by John Wiley & Sons. All rights reserved. Page 26 Sometimes we extend JFrame class to do the same: import import import import import javax.swing.JFrame; javax.swing.JPanel; java.awt.BorderLayout; javax.swing.JButton; javax.swing.SwingUtilities; public class MyJFrame extends JFrame { public MyJFrame() { setTitle("MyJFrame Example"); setSize(300, 200); setDefaultCloseOperation(EXIT_ON_CLOSE); JPanel p = new JPanel(); BorderLayout layout = new BorderLayout(); p.setLayout(layout); p.add(new JButton("North"), BorderLayout.NORTH); p.add(new JButton("South") , BorderLayout.SOUTH); p.add(new JButton("West") , BorderLayout.WEST); p.add(new JButton("East") , BorderLayout.EAST); p.add(new JButton("Center") , BorderLayout.CENTER); getContentPane().add(p); } public static void main(String[] args) { MyJFrame ex = new MyJFrame(); ex.setVisible(true); } } Page 27 Output: Copyright © 2014 by John Wiley & Sons. All rights reserved. Page 28 Grid Layout Components are placed in boxes in a simple table arrangement Specify the size (rows then columns) of the grid JPanel buttonPanel = new JPanel(); buttonPanel.setLayout(new GridLayout(4, 3)); Then add components which will be placed from the upper left, across, then down buttonPanel.add(button7); buttonPanel.add(button8); buttonPanel.add(button9); buttonPanel.add(button4); . . . Copyright © 2014 by John Wiley & Sons. All rights reserved. Page 29 Example: import java.awt.*; import javax.swing.*; public class GridLayoutDemo { public static void main(String[] args) { JFrame f = new JFrame("GridLayout Demo"); JPanel p = new JPanel(); GridLayout layout = new GridLayout(4,3); p.setLayout(layout); p.add(new p.add(new p.add(new p.add(new p.add(new p.add(new p.add(new p.add(new p.add(new p.add(new p.add(new p.add(new JButton("7")); JButton("8")); JButton("9")); JButton("4")); JButton("5")); JButton("6")); JButton("1")); JButton("2")); JButton("3")); JButton("0")); JButton(".")); JButton("CE")); f.getContentPane().add(p); f.setSize(300,300); f.setVisible(true); } } Page 30 Output: Copyright © 2014 by John Wiley & Sons. All rights reserved. Page 31 Using Nested Panels Create complex layouts by nesting panels Give each panel an appropriate layout manager Panels have invisible borders, so you can use as many panels as you need to organize components JTextField in NORTH of keypadPanel JPanel GridLayout in CENTER of keypadPanel JPanel keypadPanel = new JPanel(); keypadPanel.setLayout(new BorderLayout()); buttonPanel = new JPanel(); buttonPanel.setLayout(new GridLayout(4, 3)); buttonPanel.add(button7); buttonPanel.add(button8); // . . . keypadPanel.add(buttonPanel, BorderLayout.CENTER); JTextField display = new JTextField(); keypadPanel.add(display, BorderLayout.NORTH); Copyright © 2014 by John Wiley & Sons. All rights reserved. Page 32 import java.awt.*; import javax.swing.*; Example public class CalculatorDemo { public static void main(String[] args) { JFrame f = new JFrame("Calculator Demo"); JPanel calculatorPanel = new JPanel(); BorderLayout bLayout = new BorderLayout(); calculatorPanel.setLayout(bLayout); //add display JTextField display = new JTextField(); calculatorPanel.add(display, BorderLayout.NORTH); //add keypad JPanel keypadPanel = new JPanel(); GridLayout gLayout = new GridLayout(4,3); keypadPanel.setLayout(gLayout); keypadPanel.add(new JButton("7")); keypadPanel.add(new JButton("8")); keypadPanel.add(new JButton("9")); keypadPanel.add(new JButton("4")); keypadPanel.add(new JButton("5")); keypadPanel.add(new JButton("6")); keypadPanel.add(new JButton("1")); keypadPanel.add(new JButton("2")); keypadPanel.add(new JButton("3")); keypadPanel.add(new JButton("0")); keypadPanel.add(new JButton(".")); keypadPanel.add(new JButton("CE")); calculatorPanel.add(keypadPanel, BorderLayout.CENTER); f.getContentPane().add(calculatorPanel); f.setSize(300,300); f.setVisible(true); } } Page 33 Output: Copyright © 2014 by John Wiley & Sons. All rights reserved. Page 34 Processing Text Input Dialog boxes allows for user input… but Popping up a separate dialog box for each input is not a natural user interface Most graphical programs collect text input through text fields The JTextField class provides a text field • When you construct a text field, supply the width: – The approximate number of characters that you expect – If the user exceeds this number, text will ‘scroll’ left final int FIELD_WIDTH = 10; final JTextField rateField = new JTextField(FIELD_WIDTH); Copyright © 2014 by John Wiley & Sons. All rights reserved. Page 35 Add a Label and a Button A Label helps the user know what you want Normally to the left of a textbox JLabel rateLabel = new JLabel("Interest Rate: "); A Button with an actionPerformed method can be used to read the text from the textbox with the getText method Note that getText returns a String, and must be converted to a numeric value if it will be used in calculations double rate = Double.parseDouble(rateField.getText()); double interest = account.getBalance() * rate / 100; account.deposit(interest); resultLabel.setText("balance: " + account.getBalance()); Page 36 Programming Question Write a program InvestmentFrame2 that extends JFrame to create following GUI. Application assumes an initial balance of $1000 and a default interest rate of 5%. GUI should let user enter an interest rate. Clicking on “Add Interest button” should print the updated balance 1. Start by defining constants: 1. 2. GUI constants: frame width, frame height Application constants: default rate, initial balance 2. Define variables: 1. 2. GUI variables: rate label, rate text field, button, result label Application variables: balance Page 37 3. Create the GUI in no-argument constructor. 1. 2. 3. Initialize balance with initial balance Create result label with initial balance calls following 3 methods (you should implement) to implement GUI: – createButton(), createTextField(), createPanel() – createPanel method add all generated GUI comonents to panel. 4. Set size of frame 4. Write an inner class called AddInterestListener that implements ActionListener interface to handle action when button is pressed. • Class has only one method: public void actionPerformed(ActionEvent event){ //code to get user input rate from GUI, calculate and display new balance } • CreateButton method should: – – – create the button create object of AddInterestListener (say listener) Add listener to button: » button.addActionListener(listener); • Download template Page 38 InvestmentFrame2.java skeleton public class InvestmentFrame2 extends JFrame { /*** TODO: define constants **/ /*** TODO: define variables **/ //constructor public InvestmentFrame2() { /*** /*** /*** /*** /*** /*** TODO: TODO: TODO: TODO: TODO: TODO: initialize balance **/ create result label **/ create text field **/ create button **/ create panel**/ set size of frame **/ } private void createTextField() { /*** TODO: create rate label **/ /*** TODO: create text field with default text **/ } /** Inner class: Adds interest to the balance and updates the display. */ class AddInterestListener implements ActionListener { public void actionPerformed(ActionEvent event) { /*** TODO: get user, input rate, calculate and display updated balance in result label**/ } } private void createButton() { /*** TODO: create button **/ /*** TODO: create AddInterestActionListener object**/ /*** TODO: add this listener to button**/ } private { /*** /*** /*** } } void createPanel() TODO: create panel **/ TODO: GUI components to panel **/ TODO: add panel to frame **/ Page 39 Test the created GUI using following tester class: import javax.swing.JFrame; /** This program displays the growth of an investment with variable interest. */ public class InvestmentViewer2 { public static void main(String[] args) { JFrame frame = new InvestmentFrame2(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } } Copyright © 2014 by John Wiley & Sons. All rights reserved. Page 40 Answer InvestmentFrame2.java 1 import java.awt.event.ActionEvent; 2 import java.awt.event.ActionListener; 3 import javax.swing.JButton; 4 import javax.swing.JFrame; 5 import javax.swing.JLabel; 6 import javax.swing.JPanel; 7 import javax.swing.JTextField; 8 9 /** 10 A frame that shows the growth of an investment with variable interest. 11*/ 12public class InvestmentFrame2 extends JFrame 13{ 14 private static final int FRAME_WIDTH = 450; 15 private static final int FRAME_HEIGHT = 100; 16 17 private static final double DEFAULT_RATE = 5; 18 private static final double INITIAL_BALANCE = 1000; 19 20 private JLabel rateLabel; 21 private JTextField rateField; 22 private JButton button; 23 private JLabel resultLabel; 24 private double balance; 25 26 public InvestmentFrame2() 27 { 28 balance = INITIAL_BALANCE; 29 30 resultLabel = new JLabel("Balance: " + balance); 31 32 createTextField(); 33 createButton(); 34 createPanel(); 35 36 setSize(FRAME_WIDTH, FRAME_HEIGHT); Copyright © 2014 by John Wiley & Sons. All rights reserved. 37 } 38 Continued Page 41 39 private void createTextField() 40 { 41 rateLabel = new JLabel("Interest Rate: "); 42 43 final int FIELD_WIDTH = 10; 44 rateField = new JTextField(FIELD_WIDTH); 45 rateField.setText("" + DEFAULT_RATE); 46 } 47 48 /** 49 Adds interest to the balance and updates the display. 50 */ 51 class AddInterestListener implements ActionListener 52 { 53 public void actionPerformed(ActionEvent event) 54 { 55 double rate = Double.parseDouble(rateField.getText()); 56 double interest = balance * rate / 100; 57 balance = balance + interest; 58 resultLabel.setText("Balance: " + balance); 59 } 60 } 61 62 private void createButton() 63 { 64 button = new JButton("Add Interest"); 65 66 ActionListener listener = new AddInterestListener(); 67 button.addActionListener(listener); 68 } 69 70 private void createPanel() 71 { 72 JPanel panel = new JPanel(); 73 panel.add(rateLabel); 74 panel.add(rateField); 75 panel.add(button); 76 panel.add(resultLabel); Copyright © 2014 by John Wiley & Sons. All rights reserved. 77 add(panel); 78 } Page 42 Text Areas Create multi-line text areas with a JTextArea object Set the size in rows and columns final int ROWS = 10; final int COLUMNS = 30; JTextArea textArea = new JTextArea(ROWS, COLUMNS); Use the setText method to set the text of a text field or text area textArea.setText(“Account Balance”); Copyright © 2014 by John Wiley & Sons. All rights reserved. Page 43 Text Areas The append method adds text to the end of a text area • Use newline characters to separate lines textArea.append(account.getBalance() + "\n"); Use the setEditable method to control user input textArea.setEditable(false); Copyright © 2014 by John Wiley & Sons. All rights reserved. Page 44 JTextField and JTextArea JTextField and JTextArea inherit from JTextComponent: setText setEditable Copyright © 2014 by John Wiley & Sons. All rights reserved. Page 45 JTextField and JTextArea The append method is declared in the JTextArea class To add scroll bars, use JScrollPane: JScrollPane scrollPane = new JScrollPane(textArea); Copyright © 2014 by John Wiley & Sons. All rights reserved. Page 46 Programming Question Modify InvestmentFrame2 (save as InvestmentFrame3) to replace result label with a text area (with scroll bars). Every time the user clicks button, a new line should be added to text are showing updated total. Test code: import javax.swing.JFrame; /** This program displays the growth of an investment. */ public class InvestmentViewer3 { public static void main(String[] args) { JFrame frame = new InvestmentFrame3(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } } Page 47 Answer InvestmentFrame3.java 1 import java.awt.event.ActionEvent; 2 import java.awt.event.ActionListener; 3 import javax.swing.JButton; 4 import javax.swing.JFrame; 5 import javax.swing.JLabel; 6 import javax.swing.JPanel; 7 import javax.swing.JScrollPane; 8 import javax.swing.JTextArea; 9 import javax.swing.JTextField; 10 11/** 12 A frame that shows the growth of an investment with variable interest, 13 using a text area. 14*/ 15public class InvestmentFrame3 extends JFrame 16{ 17 private static final int FRAME_WIDTH = 400; 18 private static final int FRAME_HEIGHT = 250; 19 20 private static final int AREA_ROWS = 10; 21 private static final int AREA_COLUMNS = 30; 22 23 private static final double DEFAULT_RATE = 5; 24 private static final double INITIAL_BALANCE = 1000; 25 26 private JLabel rateLabel; 27 private JTextField rateField; 28 private JButton button; 29 private JTextArea resultArea; 30Copyright private © 2014 double by Johnbalance; Wiley & Sons. All rights reserved. 31 Continued Page 48 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 public InvestmentFrame3() { balance = INITIAL_BALANCE; resultArea = new JTextArea(AREA_ROWS, AREA_COLUMNS); resultArea.setText(balance + "\n"); resultArea.setEditable(false); createTextField(); createButton(); createPanel(); setSize(FRAME_WIDTH, FRAME_HEIGHT); } private void createTextField() { rateLabel = new JLabel("Interest Rate: "); final int FIELD_WIDTH = 10; rateField = new JTextField(FIELD_WIDTH); rateField.setText("" + DEFAULT_RATE); } Continued Copyright © 2014 by John Wiley & Sons. All rights reserved. Page 49 55 class AddInterestListener implements ActionListener 56 { 57 public void actionPerformed(ActionEvent event) 58 { 59 double rate = Double.parseDouble(rateField.getText()); 60 double interest = balance * rate / 100; 61 balance = balance + interest; 62 resultArea.append(balance + "\n"); 63 } 64 } 65 66 private void createButton() 67 { 68 button = new JButton("Add Interest"); 69 70 ActionListener listener = new AddInterestListener(); 71 button.addActionListener(listener); 72 } 73 74 private void createPanel() 75 { 76 JPanel panel = new JPanel(); 77 panel.add(rateLabel); 78 panel.add(rateField); 79 panel.add(button); 80 JScrollPane scrollPane = new JScrollPane(resultArea); 81 panel.add(scrollPane); 82 add(panel); 83 } Copyright © 2014 by John Wiley & Sons. All rights reserved. 84} Page 50 19.3 Choices In a modern graphical user interface program, there are commonly used devices to make different types of selections: Radio Buttons • For a small set of mutually exclusive choices Check Boxes • For a binary choice Combo Boxes • For a large set of choices Copyright © 2014 by John Wiley & Sons. All rights reserved. Page 51 FontViewer Layout Title Bar Label Shows current font Combo Box Check Boxes Radio Buttons Copyright © 2014 by John Wiley & Sons. All rights reserved. Page 52 Grouping Radio Buttons Add Radio Buttons into a ButtonGroup so that only one button in the group is selected at a time Create the JRadioButtons first, then add them to the ButtonGroup JRadioButton smallButton = new JRadioButton("Small"); JRadioButton mediumButton = new JRadioButton("Medium"); JRadioButton largeButton = new JRadioButton("Large"); ButtonGroup group = new ButtonGroup(); group.add(smallButton); group.add(mediumButton); group.add(largeButton); Note that the button group does not place the buttons close to each other on the container Copyright © 2014 by John Wiley & Sons. All rights reserved. Page 53 Radio Button Panels Use a panel for each set of radio buttons The default border for a panel is invisible (no border) You can add a border to a panel to make it visible along with a text label: JPanel panel = new JPanel(); panel.add(smallButton); panel.add(mediumButton); panel.add(largeButton); panel.setBorder(new EtchedBorder(),"Size")); There are a large TitledBorder(new number of border styles available • See the Swing documentation for more details Copyright © 2014 by John Wiley & Sons. All rights reserved. Page 54 Selecting Radio Buttons It is customary to set one button as selected (the default) when using radio buttons Use the button's setSelected method Set the default button before making the enclosing frame visible JRadioButton largeButton = new JRadioButton("Large"); largeButton.setSelected(true); Call the isSelected method of each button to find out which one it is currently selected if (largeButton.isSelected()) { size = LARGE_SIZE; } Copyright © 2014 by John Wiley & Sons. All rights reserved. Page 55 Check Boxes versus Radio Buttons Radio buttons and check boxes have different visual appearances Radio buttons are round and show a black dot when selected Check boxes are square and show a check mark when selected Copyright © 2014 by John Wiley & Sons. All rights reserved. Page 56 Check Boxes A check box is a user-interface component with two states: checked and unchecked • Use for choices that are not mutually exclusive – For example, text may be Italic, Bold, both or neither • Because check box settings do not exclude each other, you do not need to place a set of check boxes inside a button group Copyright © 2014 by John Wiley & Sons. All rights reserved. Page 57 Selecting Check Boxes To setup a Check Box, use Swing JCheckBox Pass the constructor the name for the check box label JCheckBox italicCheckBox = new JCheckBox("Italic"); Call the isSelected method of a checkbox to find out whether it is currently selected or not if (italicCheckBox.isSelected()) { style = style + Font.ITALIC } Copyright © 2014 by John Wiley & Sons. All rights reserved. Page 58 Combo Boxes A combo box is a combination of a list and a text field Use a combo box for a large set of choices • Use when radio buttons would take up too much space It can also be editable • Type a selection into a blank line facenameCombo.setEditable(); When you click on the arrow to the right of the text field of a combo box, a list of selections drops down, and you can choose one of the items in the list Copyright © 2014 by John Wiley & Sons. All rights reserved. Page 59 Adding and Selecting Items Add text ‘items’ to a combo box that will show in the list: JComboBox facenameCombo = new JComboBox(); facenameCombo.addItem("Serif"); facenameCombo.addItem("SansSerif"); . . . Use the getSelectedItem method to return the selected item (as an Object) Combo boxes can store other objects in addition to strings, so casting to a string may be required: String selectedString = (String) facenameCombo.getSelectedItem(); Copyright © 2014 by John Wiley & Sons. All rights reserved. Page 60 Programming Question Write a program FontFrame to create the following GUI: The font displayed should change when user select different choices from combo box, checkboxes and radio buttons E.g. when user selects italics, text “Big Java ” should be displayed in italics. Serif, SansSerif, Monospaced Copyright © 2014 by John Wiley & Sons. All rights reserved. Page 61 1. 2. Create constants: frame width and frame height Create variables: 1. 2. 3. 4. 5. 3. Define no argument constructor 1. 2. 3. 4. 5. 4. Label to display font “Big Java” 2 Checkboxes : italics, bold 3 Radiobuttons: small, medium, large Combobox for font face name (Serif, SansSerif, Monospaced) ActionListener to change display text based on user selections Construct label with text “Big Java” Add label to BorderLayout.CENTER createControlPanel() : create checkboxes, radiobuttons, comboboxes add it to BorderLayout.SOUTH. Set label font Set size Implement nested class ChoiceListener that implements ActionListener 1. Actionperformed method will set the label font to current user choices Download template Page 62 Test FontFrame class using following Tester class: import javax.swing.JFrame; /** This program allows the user to view font effects. */ public class FontViewer { public static void main(String[] args) { JFrame frame = new FontFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setTitle("FontViewer"); frame.setVisible(true); } } Page 63 Answer 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 import import import import import import import import import import import import import import import FontFrame.java java.awt.BorderLayout; java.awt.Font; java.awt.GridLayout; java.awt.event.ActionEvent; java.awt.event.ActionListener; javax.swing.ButtonGroup; javax.swing.JButton; javax.swing.JCheckBox; javax.swing.JComboBox; javax.swing.JFrame; javax.swing.JLabel; javax.swing.JPanel; javax.swing.JRadioButton; javax.swing.border.EtchedBorder; javax.swing.border.TitledBorder; /** This frame contains a text sample and a control panel to change the font of the text. */ public class FontFrame extends JFrame { private static final int FRAME_WIDTH = 300; private static final int FRAME_HEIGHT = 400; private private private private private private private private JLabel label; JCheckBox italicCheckBox; JCheckBox boldCheckBox; JRadioButton smallButton; JRadioButton mediumButton; JRadioButton largeButton; JComboBox facenameCombo; ActionListener listener; Continued Page 64 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 /** Constructs the frame. */ public FontFrame() { // Construct text sample label = new JLabel("Big Java"); add(label, BorderLayout.CENTER); // This listener is shared among all components listener = new ChoiceListener(); createControlPanel(); setLabelFont(); setSize(FRAME_WIDTH, FRAME_HEIGHT); } class ChoiceListener implements ActionListener { public void actionPerformed(ActionEvent event) { setLabelFont(); } } Continued Page 65 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 /** Creates the control panel to change the font. */ public void createControlPanel() { JPanel facenamePanel = createComboBox(); JPanel sizeGroupPanel = createCheckBoxes(); JPanel styleGroupPanel = createRadioButtons(); // Line up component panels JPanel controlPanel = new JPanel(); controlPanel.setLayout(new GridLayout(3, 1)); controlPanel.add(facenamePanel); controlPanel.add(sizeGroupPanel); controlPanel.add(styleGroupPanel); // Add panels to content pane add(controlPanel, BorderLayout.SOUTH); } /** Creates the combo box with the font style choices. @return the panel containing the combo box */ public JPanel createComboBox() { facenameCombo = new JComboBox(); facenameCombo.addItem("Serif"); facenameCombo.addItem("SansSerif"); facenameCombo.addItem("Monospaced"); facenameCombo.setEditable(true); facenameCombo.addActionListener(listener); JPanel panel = new JPanel(); panel.add(facenameCombo); return panel; } Continued Page 66 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 /** Creates the check boxes for selecting bold and italic styles. @return the panel containing the check boxes */ public JPanel createCheckBoxes() { italicCheckBox = new JCheckBox("Italic"); italicCheckBox.addActionListener(listener); boldCheckBox = new JCheckBox("Bold"); boldCheckBox.addActionListener(listener); JPanel panel = new JPanel(); panel.add(italicCheckBox); panel.add(boldCheckBox); panel.setBorder(new TitledBorder(new EtchedBorder(), "Style")); return panel; } Continued Page 67 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 /** Creates the radio buttons to select the font size. @return the panel containing the radio buttons */ public JPanel createRadioButtons() { smallButton = new JRadioButton("Small"); smallButton.addActionListener(listener); mediumButton = new JRadioButton("Medium"); mediumButton.addActionListener(listener); largeButton = new JRadioButton("Large"); largeButton.addActionListener(listener); largeButton.setSelected(true); // Add radio buttons to button group ButtonGroup group = new ButtonGroup(); group.add(smallButton); group.add(mediumButton); group.add(largeButton); JPanel panel = new JPanel(); panel.add(smallButton); panel.add(mediumButton); panel.add(largeButton); panel.setBorder(new TitledBorder(new EtchedBorder(), "Size")); Continued return panel; } Page 68 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 } /** Gets user choice for font name, style, and size and sets the font of the text sample. */ public void setLabelFont() { // Get font name String facename = (String) facenameCombo.getSelectedItem(); // Get font style int style = 0; if (italicCheckBox.isSelected()) { style = style + Font.ITALIC; } if (boldCheckBox.isSelected()) { style = style + Font.BOLD; } // Get font size int size = 0; final int SMALL_SIZE = 24; final int MEDIUM_SIZE = 36; final int LARGE_SIZE = 48; if (smallButton.isSelected()) { size = SMALL_SIZE; } else if (mediumButton.isSelected()) { size = MEDIUM_SIZE; } else if (largeButton.isSelected()) { size = LARGE_SIZE; } // Set font of text field label.setFont(new Font(facename, style, size)); label.repaint(); } Page 69 Steps to Design a User Interface 1) Make a sketch of the component layout. Draw all the buttons, labels, text fields, and borders on a sheet of graph paper Copyright © 2014 by John Wiley & Sons. All rights reserved. Page 70 Steps to Design a User Interface 2) Find groupings of adjacent components with the same layout. Start by looking at adjacent components that are arranged top to bottom or left to right Copyright © 2014 by John Wiley & Sons. All rights reserved. Page 71 Steps to Design a User Interface 3) Identify layouts for each group. For horizontal components, use flow Layout For vertical components, use a grid layout with one column 4) Group the groups together. Look at each group as one blob, and group the blobs together into larger groups, just as you grouped the components in the preceding step Copyright © 2014 by John Wiley & Sons. All rights reserved. Page 72 Steps to Design a User Interface 5) Write the code to generate the layout JPanel radioButtonPanel = new JPanel(); radioButtonPanel.setLayout(new GridLayout(3, 1)); radioButton.setBorder(new TitledBorder(new EtchedBorder(), "Size")); radioButtonPanel.add(smallButton); radioButtonPanel.add(mediumButton); radioButtonPanel.add(largeButton); JPanel checkBoxPanel = new JPanel(); checkBoxPanel.setLayout(new GridLayout(2, 1)); checkBoxPanel.add(pepperoniButton()); checkBoxPanel.add(anchoviesButton()); JPanel pricePanel = new JPanel(); // Uses FlowLayout by default pricePanel.add(new JLabel("Your Price:")); pricePanel.add(priceTextField); JPanel centerPanel = new JPanel(); // Uses FlowLayout centerPanel.add(radioButtonPanel); centerPanel.add(checkBoxPanel); // Frame uses BorderLayout by default add(centerPanel, BorderLayout.CENTER); add(pricePanel, BorderLayout.SOUTH); Page 73 19.4 Menus A frame can contain a menu bar Menu items can be added to each Menu or subMenu public class MyFrame extends JFrame { public MyFrame() { JMenuBar menuBar = new JMenuBar(); setJMenuBar(menuBar); Instantiate a menu bar, then add it to the . . . frame with the setJMenuBar method. } . . . } Copyright © 2014 by John Wiley & Sons. All rights reserved. Page 74 MenuBar and Menu Items The MenuBar contains Menus The container for the top-level Menu items is called a MenuBar • Add JMenu objects to the MenuBar JMenuBar menuBar = new JMenuBar(); JMenu fileMenu = new JMenu("File"); JMenu fontMenu = new JMenu("Font"); menuBar.add(fileMenu); menuBar.add(fontMenu); A Menu contains SubMenus and Menu items • A Menu item has no further SubMenus • You add Menu items and SubMenus with the add method Copyright © 2014 by John Wiley & Sons. All rights reserved. Page 75 Menu Item Events Menu items generate action events when selected Add action listeners only to menu items • Not to menus or the menu bar • When the user clicks on a menu name and a submenu opens, no action event is sent Copyright © 2014 by John Wiley & Sons. All rights reserved. Page 76 Menu Item Events Add action listeners to each Menu item ActionListener listener = new ExitItemListener(); exitItem.addActionListener(listener); The listener is customized for each Menu item Copyright © 2014 by John Wiley & Sons. All rights reserved. Page 77 FaceEvent ActionListener (2) Listener Inner Class version public JMenuItem createFaceItem(final String name) // Final variables can be accessed from an inner class method { class FaceItemListener implements ActionListener { public void actionPerformed(ActionEvent event) { facename = name; // Accesses the local variable name setLabelFont(); } } JMenuItem item = new JMenuItem(name); ActionListener listener = new FaceItemListener(); item.addActionListener(listener); return item; } Page 78 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 import import import import import import import import import java.awt.BorderLayout; java.awt.Font; java.awt.event.ActionEvent; java.awt.event.ActionListener; javax.swing.JFrame; javax.swing.JLabel; javax.swing.JMenu; javax.swing.JMenuBar; javax.swing.JMenuItem; /** This frame has a menu with commands to change the font of a text sample. */ public class FontFrame2 extends JFrame { private static final int FRAME_WIDTH = 300; private static final int FRAME_HEIGHT = 400; private private private private JLabel label; String facename; int fontstyle; int fontsize; /** Constructs the frame. */ Continued Page 79 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 public FontFrame2() { // Construct text sample label = new JLabel("Big Java"); add(label, BorderLayout.CENTER); // Construct menu JMenuBar menuBar = new JMenuBar(); setJMenuBar(menuBar); menuBar.add(createFileMenu()); menuBar.add(createFontMenu()); facename = "Serif"; fontsize = 24; fontstyle = Font.PLAIN; setLabelFont(); setSize(FRAME_WIDTH, FRAME_HEIGHT); } class ExitItemListener implements ActionListener { public void actionPerformed(ActionEvent event) { System.exit(0); } } Continued Page 80 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 /** Creates the File menu. @return the menu */ public JMenu createFileMenu() { JMenu menu = new JMenu("File"); JMenuItem exitItem = new JMenuItem("Exit"); ActionListener listener = new ExitItemListener(); exitItem.addActionListener(listener); menu.add(exitItem); return menu; } /** Creates the Font submenu. @return the menu */ public JMenu createFontMenu() { JMenu menu = new JMenu("Font"); menu.add(createFaceMenu()); menu.add(createSizeMenu()); menu.add(createStyleMenu()); return menu; } /** Creates the Face submenu. @return the menu */ public JMenu createFaceMenu() { JMenu menu = new JMenu("Face"); menu.add(createFaceItem("Serif")); menu.add(createFaceItem("SansSerif")); menu.add(createFaceItem("Monospaced")); return menu; } Continued Page 81 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 120 121 122 /** Creates the Size submenu. @return the menu */ public JMenu createSizeMenu() { JMenu menu = new JMenu("Size"); menu.add(createSizeItem("Smaller", -1)); menu.add(createSizeItem("Larger", 1)); return menu; } /** Creates the Style submenu. @return the menu */ public JMenu createStyleMenu() { JMenu menu = new JMenu("Style"); menu.add(createStyleItem("Plain", Font.PLAIN)); menu.add(createStyleItem("Bold", Font.BOLD)); menu.add(createStyleItem("Italic", Font.ITALIC)); menu.add(createStyleItem("Bold Italic", Font.BOLD+ Font.ITALIC)); return menu; } Continued Page 82 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 /** Creates a menu item to change the font face and set its action listener. @param name the name of the font face @return the menu item */ public JMenuItem createFaceItem(final String name) { class FaceItemListener implements ActionListener { public void actionPerformed(ActionEvent event) { facename = name; setLabelFont(); } } JMenuItem item = new JMenuItem(name); ActionListener listener = new FaceItemListener(); item.addActionListener(listener); return item; } Continued Page 83 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 /** Creates a menu item to change the font size and set its action listener. @param name the name of the menu item @param increment the amount by which to change the size @return the menu item */ public JMenuItem createSizeItem(String name, final int increment) { class SizeItemListener implements ActionListener { public void actionPerformed(ActionEvent event) { fontsize = fontsize + increment; setLabelFont(); } } JMenuItem item = new JMenuItem(name); ActionListener listener = new SizeItemListener(); item.addActionListener(listener); return item; } Continued Page 84 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201} /** Creates a menu item to change the font style and set its action listener. @param name the name of the menu item @param style the new font style @return the menu item */ public JMenuItem createStyleItem(String name, final int style) { class StyleItemListener implements ActionListener { public void actionPerformed(ActionEvent event) { fontstyle = style; setLabelFont(); } } JMenuItem item = new JMenuItem(name); ActionListener listener = new StyleItemListener(); item.addActionListener(listener); return item; } /** Sets the font of the text sample. */ public void setLabelFont() { Font f = new Font(facename, fontstyle, fontsize); label.setFont(f); } Try it: ch19/section_4 Page 85 JDesktopPane and JInternalFrame Allow you to display child windows inside main/parent windows Create Desktop pane inside JFrame: JDesktopPane theDesktop; theDesktop = new JDesktopPane(); add( theDesktop ); // add desktop pane to JFrame Create an internal frame: JInternalFrame internalFrame = new JInternalFrame("Internal Frame", true, true, true, true ); or define a class that extend JInternalFrame and then: JInternalFrame internalFrame = new LoginInternalFrame(); Add internal frame to Desktop pane: theDesktop.add( internalFrame ); // attach internal frame Page 86 Copyright © 2014 by John Wiley & Sons. All rights reserved. Page 87 Programming Question Create a Jframe MainMenuFrame with a menu “File” that has a menu item “Acess Internal Frame”. Clicking on this should create and display a internal frame (JInternalFrame) displaying text “sample text” So the JInternalFrame should be created inside JMenuItem listener actionperformed method Clicking on close button should close the internal frame. Write a main method to test your code. Copyright © 2014 by John Wiley & Sons. All rights reserved. Page 88 Answer 1 import java.awt.BorderLayout; 2 import java.awt.Dimension; 3 import java.awt.Graphics; 4 import java.awt.event.ActionListener; 5 import java.awt.event.ActionEvent; 6 import java.util.Random; 7 import javax.swing.JFrame; 8 import javax.swing.JDesktopPane; 9 import javax.swing.JMenuBar; 10import javax.swing.JMenu; 11import javax.swing.JMenuItem; 12import javax.swing.JInternalFrame; 13import javax.swing.JPanel; 14import javax.swing.JLabel; 15import javax.swing.ImageIcon; 16 17public class MainMenuFrame extends JFrame 18{ 19 private JDesktopPane theDesktop; 20 Copyright © 2014 by John Wiley & Sons. All rights reserved. Continued Page 89 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 // set up GUI public MainMenuFrame() { super( "Using a JDesktopPane" ); JMenuBar bar = new JMenuBar(); // create menu bar JMenu addMenu = new JMenu( "File" ); // create Add menu JMenuItem accessMenuItem = new JMenuItem( "AcessInternalFrame" ); addMenu.add( accessMenuItem ); // add new frame item to Add menu bar.add( addMenu ); // add Add menu to menu bar setJMenuBar( bar ); // set menu bar for this application theDesktop = new JDesktopPane(); // create desktop pane add( theDesktop ); // add desktop pane to frame Continued Copyright © 2014 by John Wiley & Sons. All rights reserved. Page 90 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 // set up listener for newFrame menu item accessMenuItem.addActionListener( new ActionListener() // anonymous inner class { // display new internal window public void actionPerformed( ActionEvent event ) { // create internal frame JInternalFrame internalFrame = new JInternalFrame("Internal Frame", true, true, true, true ); internalFrame.setTitle("Sample Internal Frame"); internalFrame.setSize(500, 500); internalFrame.setDefaultCloseOperation(DISPOSE_ON_CLOSE); JPanel p = new JPanel(); p.add(new JLabel("sample text")); internalFrame.getContentPane().add(p); internalFrame.add( p, BorderLayout.CENTER ); // add panel internalFrame.pack(); // set internal frame to size of contents theDesktop.add( internalFrame ); // attach internal frame internalFrame.setVisible( true ); // show internal frame } } ); } Continued Page 91 65 66 67 68 69 70 71 72} public static void main( String[] args ) { MainMenuFrame mainMenuFrame = new MainMenuFrame(); mainMenuFrame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); mainMenuFrame.setSize( 600, 480 ); // set frame size mainMenuFrame.setVisible( true ); // display frame } Copyright © 2014 by John Wiley & Sons. All rights reserved. Page 92 Creating Password Text Create variable of type JPasswordField field: JPasswordField passwordField; Create JPasswordField object: passwordField = new JPasswordField( "Hidden text" ); Add ActionListner: passwordField.addActionListener( listener); listener should check user name and password typed in by user matches entry in a password database or file. Copyright © 2014 by John Wiley & Sons. All rights reserved. Page 93 Programming Question Create a main menu with one menu(File) and one menu item (Login). Clicking on the login button should display a Internal frame for login implement LoginInternalFrame that extends InternaFrame The Login button should validate user against a logins.txt and display message “successful login” or “unsuccessful login” Hint: Page 94 Answer import import import import import import import import import import import import import import import MainMenuFrame2.java java.awt.BorderLayout; java.awt.Dimension; java.awt.Graphics; java.awt.event.ActionListener; java.awt.event.ActionEvent; java.util.Random; javax.swing.JFrame; javax.swing.JDesktopPane; javax.swing.JMenuBar; javax.swing.JMenu; javax.swing.JMenuItem; javax.swing.JInternalFrame; javax.swing.JPanel; javax.swing.JLabel; javax.swing.ImageIcon; public class MainMenuFrame2 extends JFrame { private JDesktopPane theDesktop; Copyright © 2014 by John Wiley & Sons. All rights reserved. Continued Page 95 // set up GUI public MainMenuFrame2() { super( "Student Registration System" ); JMenuBar bar = new JMenuBar(); // create menu bar JMenu addMenu = new JMenu( "File" ); // create Add menu JMenuItem loignMenuItem = new JMenuItem( "Login" ); addMenu.add( loignMenuItem ); // add new frame item to Add menu bar.add( addMenu ); // add Add menu to menu bar setJMenuBar( bar ); // set menu bar for this application theDesktop = new JDesktopPane(); // create desktop pane add( theDesktop ); loignMenuItem.addActionListener(// set up listener for newFrame menu item new ActionListener() // anonymous inner class { // display new internal window public void actionPerformed( ActionEvent event ) { // create internal frame JInternalFrame internalFrame = new LoginInternalFrame(); internalFrame.setSize(500, 500); internalFrame.setDefaultCloseOperation(DISPOSE_ON_CLOSE); internalFrame.pack(); // set internal frame to size of contents theDesktop.add( internalFrame); // attach internal frame internalFrame.setVisible( true ); // show internal frame } } ); } Continued Page 96 public static void main( String[] args ) { MainMenuFrame2 mainMenuFrame = new MainMenuFrame2(); mainMenuFrame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); mainMenuFrame.setSize( 600, 480 ); // set frame size mainMenuFrame.setVisible( true ); // display frame } } Page 97 LoginInternalFrame.java import import import import import import import import import import import import import java.awt.event.ActionListener; java.awt.event.ActionEvent; javax.swing.JFrame; javax.swing.JLabel; javax.swing.JButton; javax.swing.JTextField; javax.swing.JPasswordField; javax.swing.JOptionPane; javax.swing.JInternalFrame; java.util.Scanner; java.awt.GridLayout; java.io.File; java.util.Arrays; public class LoginInternalFrame extends JInternalFrame { private JLabel userLabel; //user label private JTextField userTextField; // user text filed private JLabel passwordLabel; //user label private JPasswordField passwordField; // password field with text private JButton loginButton; //login button private JButton cancelButton; //cancel button String userName; char[] password; Continued Page 98 public LoginInternalFrame() { super("Login", true, true, true, true ); //setTitle("Login"); setLayout( new GridLayout(3,2) ); userLabel = new JLabel("User Name: "); passwordLabel = new JLabel("Password: "); userTextField = new JTextField( 10 ); passwordField = new JPasswordField( 10 ); loginButton = new JButton("Login"); cancelButton = new JButton("Cancel"); getContentPane().add(userLabel); getContentPane().add(userTextField); getContentPane().add(passwordLabel); getContentPane().add(passwordField); getContentPane().add(loginButton); getContentPane().add(cancelButton); LoginHandler handler = new LoginHandler(); loginButton.addActionListener( handler ); cancelButton.addActionListener( handler ); } Continued Page 99 private class LoginHandler implements ActionListener { // process textfield events public void actionPerformed( ActionEvent event ) { if ( event.getSource() == loginButton ) { userName = userTextField.getText(); password = passwordField.getPassword(); boolean foundMatch = false; try { Scanner sc = new Scanner(new File("logins.txt")); while(sc.hasNext() && !foundMatch) { String[] entry = sc.next().split(","); System.out.println("user: "+userName+ " entry[0]: "+entry[0]); System.out.println("password: "+password+ " entry[1]: "+entry[1]); if( Arrays.equals (entry[0].toCharArray(), userName.toCharArray()) && Arrays.equals (entry[1].toCharArray(), password)) { foundMatch = true; break; } } Continued Page 100 if(!foundMatch) { JOptionPane.showMessageDialog( null, "Unsuccessful Login","Failed Login", JOptionPane.ERROR_MESSAGE ); userTextField.setText(""); passwordField.setText(""); } else { JOptionPane.showMessageDialog( null, "Successful Login","Successful Login", JOptionPane.INFORMATION_MESSAGE ); setClosed( true ); } } catch(Exception e) { e.printStackTrace(); } } else if( event.getSource() == cancelButton ) { setVisible(false); } } } } Page 101 Project: Your project main menu window should ideally have only login menu item enabled. A User first select login menu item and login. Upon successful login, other menu items (register for course, enter grades etc.) should be enabled. You can provide role based access to each user by also keeping a separate file: • Sample entries: Tim, professor James, Student If Tim logs in successfully, for example, only certain menu items are enabled. • Enable enter grades menu item • Disable register for classes menu item You can maintain a separate file which specify allowed operation for each role: • Sample entries: professor: enterGrades, student: registerSection, printGrades Log off button can save what he did to necessary files and reset main menu frame to only enable login menu item. Page 102 JLists A list displays a series of items from which the user may select one or more items created with class JList supports : Single-selection lists • allow only one item to be selected at a time Multiple-selection lists • allow any number of items to be selected Copyright © 2014 by John Wiley & Sons. All rights reserved. Page 103 ListFrame.java // ListFrame.java import java.awt.FlowLayout; import java.awt.Color; import javax.swing.JFrame; import javax.swing.JList; import javax.swing.JScrollPane; import javax.swing.event.ListSelectionListener; import javax.swing.event.ListSelectionEvent; import javax.swing.ListSelectionModel; public class ListFrame extends JFrame { private JList colorJList; // list to display colors private static final String[] colorNames = { "Black", "Blue", "Cyan", "Dark Gray", "Gray", "Green", "Light Gray", "Magenta", "Orange", "Pink", "Red", "White", "Yellow" }; private static final Color[] colors = { Color.BLACK, Color.BLUE, Color.CYAN, Color.DARK_GRAY, Color.GRAY, Color.GREEN, Color.LIGHT_GRAY, Color.MAGENTA, Color.ORANGE, Color.PINK, Color.RED, Color.WHITE, Color.YELLOW }; Continued Page 104 public ListFrame() { super( "List Test" ); setLayout( new FlowLayout() ); // set frame layout colorJList = new JList( colorNames ); // create with colorNames colorJList.setVisibleRowCount( 5 ); // display five rows at once // do not allow multiple selections colorJList.setSelectionMode( ListSelectionModel.SINGLE_SELECTION ); // add a JScrollPane containing JList to frame add( new JScrollPane( colorJList ) ); colorJList.addListSelectionListener( new ListSelectionListener() // anonymous inner class { // handle list selection events public void valueChanged( ListSelectionEvent event ) { getContentPane().setBackground( colors[ colorJList.getSelectedIndex() ] ); } // end method valueChanged } // end anonymous inner class ); // end call to addListSelectionListener } // end ListFrame constructor } // end class ListFrame Page 105 JTabbedPane Arranges GUI components into layers, of which only one is visible at a time. Users access each layer via a tab When the user clicks a tab, the appropriate layer is displayed. The tabs appear at the top by default Any component can be placed on a tab. Copyright © 2014 by John Wiley & Sons. All rights reserved. Page 106 JTabbedPaneFrame.java import import import import import import import import java.awt.BorderLayout; java.awt.Color; javax.swing.JFrame; javax.swing.JTabbedPane; javax.swing.JLabel; javax.swing.JPanel; javax.swing.JButton; javax.swing.SwingConstants; public class JTabbedPaneFrame extends JFrame { // set up GUI public JTabbedPaneFrame() { super( "JTabbedPane Demo " ); JTabbedPane tabbedPane = new JTabbedPane(); // create JTabbedPane // set up pane11 and add it to JTabbedPane JLabel label1 = new JLabel( "panel one", SwingConstants.CENTER ); JPanel panel1 = new JPanel(); // create first panel panel1.add( label1 ); // add label to panel tabbedPane.addTab( "Tab One", null, panel1, "First Panel" ); // set up panel2 and add it to JTabbedPane JLabel label2 = new JLabel( "panel two", SwingConstants.CENTER ); JPanel panel2 = new JPanel(); // create second panel panel2.add( label2 ); // add label to panel tabbedPane.addTab( "Tab Two", null, panel2, "Second Panel" ); Continued Page 107 // set up panel3 and add it to JTabbedPane JLabel label3 = new JLabel( "panel three" ); JPanel panel3 = new JPanel(); // create third panel panel3.setLayout( new BorderLayout() ); // use borderlayout panel3.add( new JButton( "North" ), BorderLayout.NORTH ); panel3.add( new JButton( "West" ), BorderLayout.WEST ); panel3.add( new JButton( "East" ), BorderLayout.EAST ); panel3.add( new JButton( "South" ), BorderLayout.SOUTH ); panel3.add( label3, BorderLayout.CENTER ); tabbedPane.addTab( "Tab Three", null, panel3, "Third Panel" ); add( tabbedPane ); // add JTabbedPane to frame } // end JTabbedPaneFrame constructor } Page 108 JTabbedPaneDemo.java import javax.swing.JFrame; public class JTabbedPaneDemo { public static void main( String[] args ) { JTabbedPaneFrame tabbedPaneFrame = new JTabbedPaneFrame(); tabbedPaneFrame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); tabbedPaneFrame.setSize( 300, 300 ); // set frame size tabbedPaneFrame.setVisible( true ); // display frame } // end main } // end class JTabbedPaneDemo Copyright © 2014 by John Wiley & Sons. All rights reserved. Page 109 Find out more: BoxLayout GridBagLayout Jpopup menus Page 110