java swing v2.1 workshop solutions

Upload: muhammad-imran-saeed

Post on 30-May-2018

233 views

Category:

Documents


0 download

TRANSCRIPT

  • 8/14/2019 Java Swing v2.1 Workshop Solutions

    1/60

    Java Swing

    Workshop Solutions

  • 8/14/2019 Java Swing v2.1 Workshop Solutions

    2/60

    Java Swing: Workshop Solutions

    Table of Contents

    Workshop 2: Using Basic Components ........................................................................................i

    Workshop 3: Using Swing Containers .......................................................................................vii

    Workshop 4: Using Menus & ToolBars .....................................................................................xiv

    Workshop 5: Using Common Dialogs .....................................................................................xxiii Workshop 6: Using Borders ...................................................................................................xxxiv

    Workshop 7: Using Internal Frames..........................................................................................xlv

    Workshop 8: Using a List Model................................................................................................lvii

    2003 SkillBuilders Inc. V 2.1

  • 8/14/2019 Java Swing v2.1 Workshop Solutions

    3/60

    Java SWing: Workshop Solutions Page i

    Workshop 2: Using Basic Components

    SwingApp.java

    // SwingApp.java

    // After Basic Components exercise.

    import java.awt.*;import java.awt.event.*;import javax.swing.*;

    public class SwingApp {public static void main( String[] args ) {

    new MainWindow(args);}

    }

    class MainWindow extends Frame {private ToolBar toolBar;private StatusBar statusBar = new StatusBar();private JTextArea textArea = new JTextArea();

    // Constructorpublic MainWindow(String[] args) {

    super("Studentsoft Super System");initLayout();

    // A simple anonymous adapter to handle// windowClosing event.

    addWindowListener( new WindowAdapter() {windowClosing( WindowEvent we ) {public voidquit(0);

    }} );

    // Set font of entire frame just before showing.FontSetter.setFont( this, new Font("SansSerif", Font.PLAIN, 24) );

    show();

    2003 SkillBuilders Inc. V 2.1

  • 8/14/2019 Java Swing v2.1 Workshop Solutions

    4/60

    Java SWing: Workshop Solutions Page ii

    && args[0].toUpperCase().equals("LOGIN") ))

    quit(0);

    // Pop login dialog if "login" passed as 1st argument.// If user cancels or closes, close the application.if( args.length > 0

    if( ! login()

    showStatus( "Hello!" );}

    OK, false if user clicks Cancel

    n() {

    ew boolean[1];

    bOK);return bOK[0];

    }

    showStatus("Text cut to clipboard");}

    // login() pops the LoginDialog, returns true if// user clicks// or closes.private boolean logi

    // return true;boolean bOK[] = nbOK[0] = false;new LoginDialog(

    // Private methodsprivate void cut() {

    textArea.cut();

    showStatus("Text copied to clipboard");}

    showStatus("Text pasted from clipboard");}

    private void copy() {textArea.copy();

    private void paste() {

    textArea.paste();

    quit(int r etCode) {tCode);

    return true;

    private booleanSystem.exit(re

    }

    private void initLayout() {

    ext("Enter / edit text here");

    add( BorderLayout.SOUTH , statusBar );

    toolBar = new ToolBar();

    // Configure text areatextArea.setLineWrap( true );textArea.setWrapStyleWord( true );textArea.setToolTipT

    // Configure framesetBounds( 100, 100, 500, 300 );add( BorderLayout.NORTH , toolBar );add( BorderLayout.CENTER, textArea );

    }

    private void showStatus( String te xt ) {

    2003 SkillBuilders Inc. V 2.1

  • 8/14/2019 Java Swing v2.1 Workshop Solutions

    5/60

    Java SWing: Workshop Solutions Page iii

    statusBar.showStatus( text );}

    new JLabel( " ", JLabel.LEFT );

    add( label, BorderLayout.SOUTH );}

    // INNER CLASSES// Inner class for status bar

    private class StatusBar extends Panel {private JLabel label =public StatusBar() {

    setLayout( new BorderLayout() );setBackground( Color.lightGray );label.setForeground( Color.black );

    xt ) {( " " + text );

    doLayout();

    } // end of StatusBar class

    anelimplements ActionListener {

    ut");ut");

    oard");

    public void showStatus( String telabel.setText

    }

    // Inner class for toolbarprivate class ToolBar extends P

    public ToolBar() {JButton btnCut = new JButton("CbtnCut.setActionCommand("cbtnCut.setMnemonic('c');btnCut.setToolTipText("Cut to clipbbtnCut.addActionListener( this );

    y");

    board");btnCopy.addActionListener( this );

    JButton btnCopy = new JButton("CopbtnCopy.setActionCommand("copy");

    btnCopy.setMnemonic('o');btnCopy.setToolTipText("Copy to clip

    ton("Paste ");

    lipboard");

    JButton btnPaste = new JButbtnPaste.setActionCommand("paste");btnPaste.setMnemonic('p');btnPaste.setToolTipText("Paste from c btnPaste.addActionListener( this );

    Color.lightGray );

    owLayout( FlowLayout.LEFT ));

    add( btnPaste );

    setBackground(setLayout( new Fladd( btnCut );add( btnCopy );

    }

    tons {

    etActionCommand().equals("paste") )paste();

    // Event handling for Cut, Copy and Paste butctionPerformed( ActionEvent ae )public void a

    if( ae.getActionCommand().equals("cut") )cut();

    else if( ae.getActionCommand().equals("copy") )copy();

    else if( ae.g

    2003 SkillBuilders Inc. V 2.1

  • 8/14/2019 Java Swing v2.1 Workshop Solutions

    6/60

    Java SWing: Workshop Solutions Page iv

    }} // end of ToolBar class

    ds Dialogimplements ActionListener {

    d:", JLabel.RIGHT);

    JButton btnCancel = new JButton("Cancel");

    his, "User Login", true );I;

    initLayout();

    d.setFocusAccelerator()

    // Login window

    private class LoginDialog exten

    boolean OKflag[];JLabel labelUID = new JLabel("User ID:", JLabel.RIGHT);JLabel labelPWD = new JLabel("PassworJTextField tfUID = new JTextField();JTextField tfPWD = new JTextField();JButton btnOK = new JButton("OK");

    public LoginDialog( boolean[] OKflagI ) {super( MainWindow.tOKflag = OKflag

    // Set up accelerators & mnemonics// For user ID field, use JTextFieltfUID.setFocusAccelerator( 'u' );labelUID.setDisplayedMnemonic( 'u' );

    l.setLabelFor()

    labelPWD.setDisplayedMnemonic( 'p' );

    // For password field, use JLabelabelPWD.setLabelFor( tfPWD );

    // Set up action commandsbtnOK.setActionCommand("ok");

    btnCancel.setActionCommand("cancel");

    // Button event handling performed by LoginDialog

    dowEvent we ) {e.getWindow().dispose();

    FontSetter.setFont( this, new Font("SansSerif", Font.PLAIN, 24)

    btnOK.addActionListener( this );btnCancel.addActionListener( this );

    // A simple anonymous adapter to handle// windowClosing event.

    pter() {addWindowListener( new WindowAdablic void windowClosing( Winpu

    w}

    } );

    // Set font of entire frame just before showing.

    );

    show();}

    med( ActionEvent ae ) {d().equals("ok") )

    = true;dispose();

    public void actionPerforctionCommanif( ae.getA

    OKflag[0]

    2003 SkillBuilders Inc. V 2.1

  • 8/14/2019 Java Swing v2.1 Workshop Solutions

    7/60

    Java SWing: Workshop Solutions Page v

    }

    gbc = new GridBagConstraints();

    setLayout( gbl );

    private void initLayout() {GridBagLayout gbl = new GridBagLayout();GridBagConstraints

    n dialogsetResizable( false ); // Make dialog fixed sizesetBounds( 100, 100, 300, 200 ); // Size & positio

    ogin window

    ( labelUID, gbc ); // apply constraintsadd( labelUID );

    // Add UID label to lgbc.gridx = 0;gbc.gridy = 0;gbc.gridwidth = 2;gbc.gridheight = 1;gbc.weightx = 0;gbc.weighty = 1;gbc.anchor = GridBagConstraints.EAST;gbc.fill = GridBagConstraints.HORIZONTAL;

    gbl.setConstraints

    ogin window

    ( labelPWD, gbc ); // apply constraints

    // Add PWD label to lgbc.gridx = 0;gbc.gridy = 1;gbc.gridwidth = 2;gbc.gridheight = 1;gbc.weightx = 0;gbc.weighty = 1;gbc.anchor = GridBagConstraints.EAST;gbc.fill = GridBagConstraints.HORIZONTAL;gbl.setConstraintsadd( labelPWD );

    to login window

    nts( tfUID, gbc ); // apply constraints

    // Add UID text fieldgbc.gridx = 2;gbc.gridy = 0;gbc.gridwidth = 2;gbc.gridheight = 1;gbc.weightx = 1;gbc.weighty = 1;gbc.anchor = GridBagConstraints.WEST;

    = GridBagConstraints.HORIZONTAL;gbc.fillgbl.setConstrai add( tfUID );

    to login window

    nts( tfPWD, gbc ); // apply constraints

    // Add PWD text fieldgbc.gridx = 2;gbc.gridy = 1;gbc.gridwidth = 2;gbc.gridheight = 1;gbc.weightx = 1;gbc.weighty = 1;gbc.anchor = GridBagConstraints.WEST;

    = GridBagConstraints.HORIZONTAL;gbc.fillgbl.setConstrai add( tfPWD );

    2003 SkillBuilders Inc. V 2.1

  • 8/14/2019 Java Swing v2.1 Workshop Solutions

    8/60

    Java SWing: Workshop Solutions Page vi

    // Add OK button to login window

    nts( btnOK, gbc ); // apply constraintsadd( btnOK );

    gbc.gridx = 1;gbc.gridy = 2;gbc.gridwidth = 1;gbc.gridheight = 1;

    gbc.weightx = 0;gbc.weighty = 1;gbc.anchor = GridBagConstraints.CENTER;gbc.fill = GridBagConstraints.NONE;gbl.setConstrai

    to login window

    btnCancel, gbc ); // apply constraintsadd( btnCancel );

    // Add Cancel buttongbc.gridx = 2;gbc.gridy = 2;gbc.gridwidth = 1;gbc.gridheight = 1;gbc.weightx = 1;gbc.weighty = 1;

    gbc.anchor = GridBagConstraints.CENTER;gbc.fill = GridBagConstraints.NONE;gbl.setConstraints(

    / Put focus on ID fieldtfUID.requestFocus(); /

    } // end of initLayout()

    ss

    // end of MainWindow class

    isplay purposes; it hasexercise.

    ponent c, Font f ) {

    t(); i++)), f );

    t(); i++)nt.getComponent(i), f );

    c.setFont( f );}

    }

    } // end of LoginWindow cla }

    // FontSetter is a convenience class. Its one static// method, setFont(), is used to change the font setting// for all components in a container. This is simply// to make the font bigger for d// no bearing on the class FontSetter {

    // Change the font of the desired component ands and menus.// all its contained component

    ompublic static void setFont( Cif( c instanceof JMenu ) {

    JMenu mnu = (JMenu) c;for(int i = 0; i < mnu.getMenuComponentCoun

    setFont( mnu.getMenuComponent(i}else if( c instanceof Container ) {

    Container cont = (Container) c;for(int i = 0; i < cont.getComponentCoun

    setFont( co}

    2003 SkillBuilders Inc. V 2.1

  • 8/14/2019 Java Swing v2.1 Workshop Solutions

    9/60

    Java SWing: Workshop Solutions Page vii

    Workshop 3: Using Swing Containers

    SwingApp.Java

    // SwingApp.java

    // After Swing Containers exercise.

    import java.awt.*;import java.awt.event.*;import javax.swing.*;

    public class SwingApp {public static void main( String[] args ) {

    new MainWindow(args);}

    }

    class MainWindow extends JFrame {private ToolBar toolBar ;private StatusBar statusBar = new StatusBar();private JTextArea textArea = new JTextArea();

    // Constructorpublic MainWindow(String[] args) {

    super("Studentsoft Super System");initLayout();

    // Turn off default closing mechanismTHING_ON_CLOSE );

    ndowAdapter() {

    setDefaultCloseOperation( JDialog.DO_NO

    // A simple anonymous adapter to handle// windowClosing event.addWindowListener( new Wi

    public void windowClosing( WindowEvent we ) {quit(0);

    }} );

    // Set font of entire frame just before showing.

    2003 SkillBuilders Inc. V 2.1

  • 8/14/2019 Java Swing v2.1 Workshop Solutions

    10/60

  • 8/14/2019 Java Swing v2.1 Workshop Solutions

    11/60

    Java SWing: Workshop Solutions Page ix

    }

    private void showStatus( String text ) {statusBar.showStatus( text );

    }

    // INNER CLASSESstatus bar

    JPanel {", JLabel.LEFT );

    erLayout() );

    // Inner class forprivate class StatusBar extends

    private JLabel label = new JLabel( "public StatusBar() {

    setLayout( new BordsetBackground( Color.lightGray );label.setForeground( Color.black );add( label, BorderLayout.SOUTH );

    }

    public void showStatus( String text ) {

    end of StatusBar class

    label.setText( " " + text );

    doLayout();}} //

    // Inner class for toolbarprivate class ToolBar extends JPanel

    implements ActionListener {

    public ToolBar() {

    to clipboard");

    .getActionCommand().equals("copy") )

    JButton btnCut = new JButton("Cut");btnCut.setActionCommand("cut");btnCut.setMnemonic('c');btnCut.setToolTipText("CutbtnCut.addActionListener( this );

    JButton btnCopy = new JButton("Copy");btnCopy.setActionCommand("copy");btnCopy.setMnemonic('o');btnCopy.setToolTipText("Copy to clipboard");btnCopy.addActionListener( this );

    JButton btnPaste = new JButton("Paste");btnPaste.setActionCommand("paste");btnPaste.setMnemonic('p');btnPaste.setToolTipText("Paste from clipboard");btnPaste.addActionListener( this );

    setBackground( Color.lightGray );setLayout( new FlowLayout( FlowLayout.LEFT ));add( btnCut );add( btnCopy );add( btnPaste );

    }

    // Event handling for Cut, Copy and Paste buttonspublic void actionPerformed( ActionEvent ae ) {

    if( ae.getActionCommand().equals("cut") )cut();

    else if( ae

    2003 SkillBuilders Inc. V 2.1

  • 8/14/2019 Java Swing v2.1 Workshop Solutions

    12/60

    Java SWing: Workshop Solutions Page x

    copy();else if( ae.getActionCommand().equals("paste") )

    end of ToolBar class

    paste();}

    } //

    // Login windowinDialog extends JDialogprivate class Log

    implements ActionListener {

    boolean OKflag[];new JLabel("User ID:", JLabel.RIGHT);

    );

    JLabel labelUID =JLabel labelPWD = new JLabel("Password:", JLabel.RIGHT);JTextField tfUID = new JTextField();JTextField tfPWD = new JTextField();JButton btnOK = new JButton("OK");JButton btnCancel = new JButton("Cancel"

    public LoginDialog( boolean[] OKflagI ) { ue );

    .setFocusAccelerator()

    );

    p' );

    );

    super( MainWindow.this, "User Login", trOKflag = OKflagI;initLayout();

    // Set up accelerators & mnemonics// For user ID field, use JTextFieldtfUID.setFocusAccelerator( 'u' );labelUID.setDisplayedMnemonic( 'u'

    // For password field, use JLabel.setLabelFor()labelPWD.setLabelFor( tfPWD );labelPWD.setDisplayedMnemonic( '

    // Set up action commandsbtnOK.setActionCommand("ok"btnCancel.setActionCommand("cancel");

    // Button event handling performed by LoginDialogbtnOK.addActionListener( this );btnCancel.addActionListener( this );

    /*// A simple anonymous adapter to handle// windowClosing event.addWindowListener( new WindowAdapter() {

    public void windowClosing( WindowEvent we ) {we.getWindow().dispose();

    }} );

    */// Use default closing mechanism to close dialogsetDefaultCloseOperation( JDialog.DISPOSE_ON_CLOSE );

    // Set font of entire frame just before showing.FontSetter.setFont( this, new Font("SansSerif", Font.PLAIN, 24)

    );

    2003 SkillBuilders Inc. V 2.1

  • 8/14/2019 Java Swing v2.1 Workshop Solutions

    13/60

    Java SWing: Workshop Solutions Page xi

    show();}

    public void actionPerformed( ActionEvent ae ) {if( ae.getActionCommand().equals("ok") )

    OKflag[0] = true;dispose();

    }

    private void initLayout() {ew GridBagLayout();

    ();GridBagLayout gbl = nGridBagConstraints gbc = new GridBagConstraintsgetContentPane().setLayout( gbl );

    setBounds( 100, 100, 300, 200 ); // Size & position dialogsetResizable( false ); // Make dialog fixed size

    // Add UID label to login window

    TAL;nstraints

    gbc.gridx = 0;

    gbc.gridy = 0;gbc.gridwidth = 2;gbc.gridheight = 1;gbc.weightx = 0;gbc.weighty = 1;gbc.anchor = GridBagConstraints.EAST;gbc.fill = GridBagConstraints.HORIZONgbl.setConstraints( labelUID, gbc ); // apply cogetContentPane().add( labelUID );

    // Add PWD label to login windowgbc.gridx = 0;gbc.gridy = 1;gbc.gridwidth = 2;

    gbc.gridheight = 1;gbc.weightx = 0;gbc.weighty = 1;gbc.anchor = GridBagConstraints.EAST;gbc.fill = GridBagConstraints.HORIZONTAL;gbl.setConstraints( labelPWD, gbc ); // apply constraintsgetContentPane().add( labelPWD );

    // Add UID text field to login windowgbc.gridx = 2;gbc.gridy = 0;gbc.gridwidth = 2;gbc.gridheight = 1;gbc.weightx = 1;gbc.weighty = 1;gbc.anchor = GridBagConstraints.WEST;gbc.fill = GridBagConstraints.HORIZONTAL;gbl.setConstraints( tfUID, gbc ); // apply constraintsgetContentPane().add( tfUID );

    // Add PWD text field to login windowgbc.gridx = 2;gbc.gridy = 1;gbc.gridwidth = 2;gbc.gridheight = 1;

    2003 SkillBuilders Inc. V 2.1

  • 8/14/2019 Java Swing v2.1 Workshop Solutions

    14/60

    Java SWing: Workshop Solutions Page xii

    gbc.weightx = 1;gbc.weighty = 1;gbc.anchor = GridBagConstraints.WEST;

    TAL;raints

    gbc.fill = GridBagConstraints.HORIZONgbl.setConstraints( tfPWD, gbc ); // apply const

    getContentPane().add( tfPWD );

    // Add OK button to login window

    BagConstraints.CENTER;

    constraints

    gbc.gridx = 1;gbc.gridy = 2;gbc.gridwidth = 1;gbc.gridheight = 1;gbc.weightx = 0;gbc.weighty = 1;gbc.anchor = Gridgbc.fill = GridBagConstraints.NONE;gbl.setConstraints( btnOK, gbc ); // applygetContentPane().add( btnOK );

    // Add Cancel button to login window

    BagConstraints.CENTER;

    gbc.gridx = 2;gbc.gridy = 2;gbc.gridwidth = 1;gbc.gridheight = 1;gbc.weightx = 1;gbc.weighty = 1;gbc.anchor = Gridgbc.fill = GridBagConstraints.NONE;gbl.setConstraints( btnCancel, gbc ); // apply constraintsgetContentPane().add( btnCancel );

    tfUID.requestFocus(); // Put focus on ID field

    ass FontSetter {t of the desired component and

    {

    tMenuComponentCount(); i++)

    Container cont = (Container) c;

    } // end of initLayout()

    } // end of LoginWindow class

    } // end of MainWindow class

    // FontSetter is a convenience class. Its one static// method, setFont(), is used to change the font setting// for all components in a container. This is simply// to make the font bigger for display purposes; it has// no bearing on the exercise.

    cl// Change the fon// all its contained components and menus.

    nt f )public static void setFont( Component c, Foif( c instanceof JMenu ) {

    JMenu mnu = (JMenu) c;gefor(int i = 0; i < mnu.

    setFont( mnu.getMenuComponent(i), f );}

    se if( c instanceof Container ) {el

    2003 SkillBuilders Inc. V 2.1

  • 8/14/2019 Java Swing v2.1 Workshop Solutions

    15/60

    Java SWing: Workshop Solutions Page xiii

    for(int i = 0; i < cont.getComponentCount(); i++)f );setFont( cont.getComponent(i),

    }c.setFont( f );

    }

    }

    2003 SkillBuilders Inc. V 2.1

  • 8/14/2019 Java Swing v2.1 Workshop Solutions

    16/60

    Java SWing: Workshop Solutions Page xiv

    Workshop 4: Using Menus & ToolBars

    SwingApp.java

    // SwingApp.java

    // After Menu & ToolBar exercise.

    import java.awt.*;import java.awt.event.*;import javax.swing.*;import javax.swing.event.*;

    public class SwingApp {public static void main( String[] args ) {

    new MainWindow(args);}

    }

    class MainWindow extends JFrame {private ToolBar toolBar ;private StatusBar statusBar = new StatusBar();private JTextArea textArea = new JTextArea();private Action actCut, actCopy, actPaste;

    // Constructorpublic MainWindow(String[] args) {

    super("Studentsoft Super System");initActions();initLayout();

    initMenu();

    // Turn off default closing mechanismsetDefaultCloseOperation( JDialog.DO_NOTHING_ON_CLOSE );

    apter to handle// A simple anonymous ad// windowClosing event.addWindowListener( new WindowAdapter() {

    public voidquit(0);

    windowClosing( WindowEvent we ) {

    2003 SkillBuilders Inc. V 2.1

  • 8/14/2019 Java Swing v2.1 Workshop Solutions

    17/60

    Java SWing: Workshop Solutions Page xv

    }} );

    FontSetter.setFont( this, new Font("SansSerif", Font.PLAIN, 24) );// Set font of entire frame just before showing.

    show();

    && args[0].toUpperCase().equals("LOGIN") ))

    quit(0);

    // Pop login dialog if "login" passed as 1st argument.// If user cancels or closes, close the application.if( args.length > 0

    if( ! login()

    showStatus( "Hello!" );}

    OK, false if user clicks Cancel

    n() {

    ew boolean[1];

    bOK);return bOK[0];

    }

    showStatus("Text cut to clipboard");

    showStatus("Text copied to clipboard");

    showStatus("Text pasted from clipboard");

    // login() pops the LoginDialog, returns true if// user clicks

    // or closes.private boolean logi// return true;boolean bOK[] = nbOK[0] = false;new LoginDialog(

    // Private methodsprivate void cut() {

    textArea.cut();

    }

    private void copy() {textArea.copy();

    }

    private void paste() {textArea.paste();

    }

    quit(int r etCode) {tCode);

    return true;

    :

    private booleanSystem.exit(re

    }

    // Set up Action objectsprivate void initActions() {

    // Action objects for cut, copy, pasteactCut = new AbstractAction("Cut") {

    d actionPerformed(ActionEvent ae) {public voicut();

    }};

    actCut.putValue(Action.SHORT_DESCRIPTION,

    2003 SkillBuilders Inc. V 2.1

  • 8/14/2019 Java Swing v2.1 Workshop Solutions

    18/60

    Java SWing: Workshop Solutions Page xvi

    "Cut text to clipboard");

    actCopy = new AbstractAction("Copy") {public void actionPerformed(ActionEvent ae) {

    copy();

    }};

    actCopy.putValue(Action.SHORT_DESCRIPTION,"Copy text to clipboard");

    actPaste = new AbstractAction("Paste") {public void actionPerformed(ActionEvent ae) {

    paste();}

    };actPaste.putValue(Action.SHORT_DESCRIPTION,

    "Paste text from clipboard");}

    private void initLayout() {toolBar = new ToolBar();

    // Configure text areatextArea.setLineWrap( true );textArea.setWrapStyleWord( true );textArea.setToolTipText("Enter / edit text here");

    // Configure framesetBounds( 100, 100, 500, 300 );getContentPane().add( BorderLayout.NORTH , toolBar );getContentPane().add( BorderLayout.CENTER, textArea );getContentPane().add( BorderLayout.SOUTH , statusBar );

    ner for textArea to react when// Create caret liste// selection changestextArea.addCaretListener( new CaretListener() {

    public void caretUpdate(CaretEvent e) {.getSelectionStart() !=boolean isSelection = textArea

    textArea.getSelectionEnd();actCut.setEnabled(isSelection);actCopy.setEnabled(isSelection);

    }});

    }

    private void initMenu() {// Local inner class for handling menu itemsclass MenuHandler implements ActionListener {

    public void actionPerformed( ActionEvent ae ) {

    ileNew") )if( ae.getActionCommand().equals("FshowStatus("New file created");

    .equals("FileOpen") )else if( ae.getActionCommand()showStatus("File opened");

    ).equals("FileSave") )else if( ae.getActionCommand(showStatus("File saved");

    else if( ae.getActionCommand().equals("FileExit") )

    2003 SkillBuilders Inc. V 2.1

  • 8/14/2019 Java Swing v2.1 Workshop Solutions

    19/60

    Java SWing: Workshop Solutions Page xvii

    quit( 0 );

    // Toggle toolbar visibilityelse if( ae.getActionCommand().equals("OptionsToolbar") ) {

    // Get source, cast it as JCheckBoxMenuItem:

    JCheckBoxMenuItem cbmi = (JCheckBoxMenuItem)ae.getSource();

    toolBar.setVisible( cbmi.isSelected() );getContentPane().doLayout();

    }}

    }

    // Instantiate handlerMenuHandler mh = new MenuHandler();

    // Create menu barJMenuBar mb = new JMenuBar();

    // Assemble File menu:JMenu mFile = new JMenu("File");mFile.setMnemonic('f');

    // File | NewJMenuItem miFNew = new JMenuItemmiFNew.addActionListener( mh );

    ("New", 'n');

    miFNew.setActionCommand("FileNew");miFNew.setAccelerator(

    KeyStroke.getKeySmFile.add(miFNew);

    troke(KeyEvent.VK_N, Event.CTRL_MASK, true ));

    // File | OpenJMenuItem miFOpen = new JMenuItem("Open", 'o');

    miFOpen.addActionListener( mh ); ("FileOpen");miFOpen.setActionCommandmiFOpen.setAccelerator(

    KeyStroke.getKeyStmFile.add(miFOpen);

    roke(KeyEvent.VK_O, Event.CTRL_MASK, true ));

    // File | Save("Save", 's');JMenuItem miFSave = new JMenuItem

    miFSave.addActionListener( mh );("FileSave");miFSave.setActionCommand

    miFSave.setAccelerator(roke(KeyEvent.VK_S, Event.CTRL_MASK, true ));KeyStroke.getKeySt

    mFile.add(miFSave);

    // SeparatormFile.addSeparator();

    // File | Exit("Exit", 'x');JMenuItem miFExit = new JMenuItem

    miFExit.addActionListener( mh );mand("FileExit");miFExit.setActionCom

    mFile.add(miFExit);

    menu to menu bar// Attach Filemb.add(mFile);

    2003 SkillBuilders Inc. V 2.1

  • 8/14/2019 Java Swing v2.1 Workshop Solutions

    20/60

    Java SWing: Workshop Solutions Page xviii

    // Create Edit menu from Action objectsJMenu mEdit = new JMenu("Edit");mEdit.setMnemonic('e');

    Action actions[] = { actCut, actCopy, actPaste };int mnemonics[] = { 'c', 'o', 'p' };for( int i = 0; i < actions.length; i++ ) {

    JMenuItem mi = mEdit.add(actions[i]);mi.setMnemonic( mnemonics[i]);String s =

    actions[i].getValue( Action.SHORT_DESCRIPTION ).toString();mi.setToolTipText( s );

    }

    mb.add(mEdit);

    // Create Options menuJMenu mOptions = new JMenu("Options");mOptions.setMnemonic('o');

    // Options | ToolbarJMenuItem miOToolbar = new JCmiOToolbar.setMnemonic('t');

    heckBoxMenuItem("Toolbar", true);

    miOToolbar.addActionListener( mh );miOToolbar.setActionCommand("OptionsToolbar");mOptions.add(miOToolbar);

    mb.add(mOptions);

    // Attach menubar to frame.

    getRootPane().setJMenuBar(mb);

    }

    ext ) {private void showStatus( String tstatusBar.showStatus( text );

    }

    // INNER CLASSES// Inner class for status barprivate class StatusBar extends JPanel {

    = new JLabel( " ", JLabel.LEFT );private JLabel labelpublic StatusBar() {

    setLayout( new BorderLayout() );setBackground( Color.lightGray );

    ;label.setForeground( Color.black )add( label, BorderLayout.SOUTH );

    }

    ext ) {public void showStatus( String tt( " " + text );label.setTex

    doLayout();}

    } // end of StatusBar class

    2003 SkillBuilders Inc. V 2.1

  • 8/14/2019 Java Swing v2.1 Workshop Solutions

    21/60

    Java SWing: Workshop Solutions Page xix

    // Inner class for toolbar// private class ToolBar extends JPanel

    private class ToolBar extends JToolBarimplements ActionListener {

    public ToolBar() {// Add actions to the toolbar to create buttons.Action actions[] = { actCut, actCopy, actPaste };for( int i = 0; i < actions.length; i++ ) {

    JButton btn = add(actions[i]);String s =

    actions[i].getValue( Action.SHORT_DESCRIPTION).toString();

    btn.setToolTipText( s );}

    /*JButton btnCut = new JButton("Cut");btnCut.setActionCommand("cut");

    btnCut.setMnemonic('c');btnCut.setToolTipText("Cut to clipboard");btnCut.addActionListener( this );

    JButton btnCopy = new JButton("Copy");btnCopy.setActionCommand("btnCopy.setMnemonic('o');

    copy");

    btnCopy.setToolTipText("Copy to clipboard");btnCopy.addActionListener( this );

    e");JButton btnPaste = new JButton("PastbtnPaste.setActionCommand("paste");btnPaste.setMnemonic('p');btnPaste.setToolTipText("Paste from

    btnPaste.addActionListener( this );

    clipboard");

    setBackground( Color.lightGray );setLayout( new FlowLayout( FlowLayout.LEFT ));add( btnCut );add( btnCopy );add( btnPaste );

    */}

    s// Event handling for Cut, Copy and Paste button{public void actionPerformed( ActionEvent ae )

    ActionCommand().equals("cut") )if( ae.getcut();

    .getActionCommand().equals("copy") )else if( aecopy();

    getActionCommand().equals("paste") )else if( ae.paste();

    }} // end of ToolBar class

    // Login windownds JDialogprivate class LoginDialog exte

    implements ActionListener {

    2003 SkillBuilders Inc. V 2.1

  • 8/14/2019 Java Swing v2.1 Workshop Solutions

    22/60

    Java SWing: Workshop Solutions Page xx

    boolean OKflag[];JLabel labelUID = new JLabel("User ID:", JLabel.RIGHT);JLabel labelPWD = new JLabel("Password:", JLabel.RIGHT);JTextField tfUID = new JTextField();

    JTextField tfPWD = new JTextField();JButton btnOK = new JButton("OK");JButton btnCancel = new JButton("Cancel");

    public LoginDialog( boolean[] OKflagI ) {super( MainWindow.this, "User Login", true );OKflag = OKflagI;initLayout();

    // Set up accelerators & mnemonics// For user ID field, use JTextField.setFocusAccelerator()tfUID.setFocusAccelerator( 'u' );labelUID.setDisplayedMnemonic( 'u' );

    // For password field, use JLabel.setLabelFor()labelPWD.setLabelFor( tfPWD );labelPWD.setDisplayedMnemonic( 'p' );

    // Set up action commandsbtnOK.setActionCommand("ok");btnCancel.setActionCommand("cancel");

    // Button event handling performed by LoginDialogbtnOK.addActionListener( this );btnCancel.addActionListener( this );

    /*

    apter to handle// A simple anonymous ad// windowClosing event.addWindowListener( new WindowAdapter() {

    public void windowClosing( Wiwe.getWindow().dispose();

    ndowEvent we ) {

    }} );

    */// Use default closing mechanism to close dialogsetDefaultCloseOperation( JDialog.DISPOSE_ON_CLOSE );

    // Set font of entire frame just before showing.FontSetter.setFont( this, new Font("SansSerif", Font.PLAIN, 24)

    );

    show();}

    ) {public void actionPerformed( ActionEvent aend().equals("ok") )if( ae.getActionComma

    ] = true;OKflag[0dispose();

    }

    private void initLayout() {

    2003 SkillBuilders Inc. V 2.1

  • 8/14/2019 Java Swing v2.1 Workshop Solutions

    23/60

    Java SWing: Workshop Solutions Page xxi

    GridBagLayout gbl = new GridBagLayout();GridBagConstraints gbc = new GridBagConstraints();getContentPane().setLayout( gbl );

    setBounds( 100, 100, 300, 200 ); // Size & position dialog

    setResizable( false ); // Make dialog fixed size

    // Add UID label to login windowgbc.gridx = 0;gbc.gridy = 0;gbc.gridwidth = 2;gbc.gridheight = 1;gbc.weightx = 0;gbc.weighty = 1;gbc.anchor = GridBagConstraints.EAST;gbc.fill = GridBagConstraints.HORIZONTAL;gbl.setConstraints( labelUID, gbc ); // apply constraintsgetContentPane().add( labelUID );

    // Add PWD label to login windowgbc.gridx = 0;gbc.gridy = 1;gbc.gridwidth = 2;gbc.gridheight = 1;gbc.weightx = 0;gbc.weighty = 1;gbc.anchor = GridBagConstraints.EAST;gbc.fill = GridBagConstraints.HORIZONTAL;gbl.setConstraints( labelPWD, gbcgetContentPane().add( labelPWD );

    ); // apply constraints

    // Add UID text field to login windowgbc.gridx = 2;

    gbc.gridy = 0;gbc.gridwidth = 2;gbc.gridheight = 1;gbc.weightx = 1;gbc.weighty = 1;gbc.anchor = GridBagConstraints.WEST;gbc.fill = GridBagConstraints.HORIZONTAL;

    ); // apply constraintsgbl.setConstraints( tfUID, gbcgetContentPane().add( tfUID );

    d to login window// Add PWD text fielgbc.gridx = 2;gbc.gridy = 1;gbc.gridwidth = 2;gbc.gridheight = 1;gbc.weightx = 1;gbc.weighty = 1;gbc.anchor = GridBagConstraints.WEST;gbc.fill = GridBagConstraints.HORIZONTAL;

    ); // apply constraintsgbl.setConstraints( tfPWD, gbcgetContentPane().add( tfPWD );

    login window// Add OK button togbc.gridx = 1;gbc.gridy = 2;

    2003 SkillBuilders Inc. V 2.1

  • 8/14/2019 Java Swing v2.1 Workshop Solutions

    24/60

    Java SWing: Workshop Solutions Page xxii

    gbc.gridwidth = 1;gbc.gridheight = 1;gbc.weightx = 0;gbc.weighty = 1;gbc.anchor = GridBagConstraints.CENTER;

    gbc.fill = GridBagConstraints.NONE;gbl.setConstraints( btnOK, gbc ); // apply constraintsgetContentPane().add( btnOK );

    // Add Cancel button to login windowgbc.gridx = 2;gbc.gridy = 2;gbc.gridwidth = 1;gbc.gridheight = 1;gbc.weightx = 1;gbc.weighty = 1;gbc.anchor = GridBagConstraints.CENTER;gbc.fill = GridBagConstraints.NONE;gbl.setConstraints( btnCancel, gbc ); // apply constraints

    getContentPane().add( btnCancel );

    tfUID.requestFocus(); // Put focus on ID field

    } // end of initLayout()

    } // end of LoginWindow class

    } // end of MainWindow class

    // FontSetter is a convenience class. Its one static// method, setFont(), is used to change the font setting

    // for all components in a container. This is simply display purposes; it has// to make the font bigger for// no bearing on the exercise.

    class FontSetter {and// Change the font of the desired component

    // all its contained components and menus.mponent c, Font f ) {public static void setFont( Co

    if( c instanceof JMenu ) {JMenu mnu = (JMenu) c;

    nt(); i++)for(int i = 0; i < mnu.getMenuComponentCousetFont( mnu.getMenuComponent(i), f );

    }else if( c instanceof Container ) {

    Container cont = (Container) c;nt(); i++)for(int i = 0; i < cont.getComponentCou

    setFont( cont.getComponent(i), f );}c.setFont( f );

    }}

    2003 SkillBuilders Inc. V 2.1

  • 8/14/2019 Java Swing v2.1 Workshop Solutions

    25/60

    Java SWing: Workshop Solutions Page xxiii

    Workshop 5: Using Common Dialogs

    SwingApp.java

    // SwingApp.java

    // After Dialogs exercise.

    import java.awt.*;import java.awt.event.*;import javax.swing.*;import javax.swing.event.*;import javax.swing.text.JTextComponent;

    public class SwingApp {public static void main( String[] args ) {

    new MainWindow(args);

    }}

    class MainWindow extends JFrame {private ToolBar toolBar ;private StatusBar statusBar = new StatusBar();private JTextArea textArea = new JTextArea();private Action actCut, actCopy, actPaste;

    // Constructorpublic MainWindow(String[] args) {

    super("Studentsoft Super System");initActions();

    initLayout()initMenu(); ;

    // Turn off default closing mechanismsetDefaultCloseOperation( JDialog.DO_NOTHING_ON_CLOSE );

    apter to handle// A simple anonymous ad// windowClosing event.addWindowListener( new WindowAdapter() {

    windowClosing( WindowEvent we ) {public void

    2003 SkillBuilders Inc. V 2.1

  • 8/14/2019 Java Swing v2.1 Workshop Solutions

    26/60

    Java SWing: Workshop Solutions Page xxiv

    quit(0);

    } );

    FontSetter.setFont( this, new Font("SansSerif", Font.PLAIN, 24) );

    }

    // Set font of entire frame just before showing.

    show();

    && args[0].toUpperCase().equals("LOGIN") ))

    quit(0);

    // Pop login dialog if "login" passed as 1st argument.// If user cancels or closes, close the application.if( args.length > 0

    if( ! login()

    showStatus( "Hello!" );}

    OK, false if user clicks Cancel

    n() {

    ew boolean[1];

    bOK);return bOK[0];

    }

    showStatus("Text cut to clipboard");

    // login() pops the LoginDialog, returns true if

    // user clicks// or closes.private boolean logi

    // return true;boolean bOK[] = nbOK[0] = false;new LoginDialog(

    // Private methodsprivate void cut() {

    textArea.cut();

    }

    private void copy() {

    showStatus("Text copied to clipboard");

    showStatus("Text pasted from clipboard");

    g Application",

    .YES_OPTION ) {tCode);

    urn true;

    return false;}

    textArea.copy();

    }

    private void paste() {textArea.paste();

    }

    private boolean quit(int retCode) {onfirmDialog( this,int intAnsw = JOptionPane.showC

    "Are you sure you want to exit?", "ExitinON );JOptionPane.YES_NO_OPTI

    OptionPaneif( intAnsw == JSystem.exit(re ret

    }else

    2003 SkillBuilders Inc. V 2.1

  • 8/14/2019 Java Swing v2.1 Workshop Solutions

    27/60

  • 8/14/2019 Java Swing v2.1 Workshop Solutions

    28/60

    Java SWing: Workshop Solutions Page xxvi

    "Paste text from clipboard");}

    toolBar = new ToolBar();

    textArea.setToolTipText("Enter / edit text here");

    getContentPane().add( BorderLayout.SOUTH , statusBar );

    private void initLayout() {

    // Configure text areatextArea.setLineWrap( true );textArea.setWrapStyleWord( true );

    // Configure framesetBounds( 100, 100, 500, 300 );getContentPane().add( BorderLayout.NORTH , toolBar );getContentPane().add( BorderLayout.CENTER, textArea );

    er for textArea to react when

    () {

    getSelectionStart() !=

    actCopy.setEnabled(isSelection);

    });

    // Create caret listen

    // selection changestextArea.addCaretListener( new CaretListenerpublic void caretUpdate(CaretEvent e) {

    boolean isSelection = textArea.textArea.getSelectionEnd();

    actCut.setEnabled(isSelection);

    }

    }

    private void initMenu() {// Local inner class for handling menu itemsclass MenuHandler implements ActionListener {

    public void actionPerformed( ActionEvent ae ) {

    if( ae.getActionCommand().equals("Fi leNew") )

    als("FileOpen") )

    ActionCommand().equals("FileExit") )

    lbar") ) {

    m)

    ected() );getContentPane().doLayout();

    nd().equals("OptionsFont") )chooseFont(textArea);

    showStatus("New file created")ActionCommand().equ

    ;else if( ae.get

    // showStatus("File opened");openFile();

    else if( ae.getActionCommand().equals("FileSave") )"File saved");showStatus(

    else if( ae.get quit( 0 );

    // Toggle toolbar visibilityelse if( ae.getActionCommand().equals("OptionsToo

    // Get source, cast it as JCheckBoxMenuItem:JCheckBoxMenuItem cbmi = (JCheckBoxMenuIte

    ae.getSource();toolBar.setVisible( cbmi.isSel

    }

    // Set font on text areaelse if( ae.getActionComma

    2003 SkillBuilders Inc. V 2.1

  • 8/14/2019 Java Swing v2.1 Workshop Solutions

    29/60

    Java SWing: Workshop Solutions Page xxvii

    }}

    MenuHandler mh = new MenuHandler();

    JMenuBar mb = new JMenuBar();

    File");mFile.setMnemonic('f');

    "New", 'n');

    "FileNew");

    roke(KeyEvent.VK_N, Event.CTRL_MASK, true ));

    mFile.add(miFNew);

    "Open", 'o');

    oke(KeyEvent.VK_O, Event.CTRL_MASK, true ));mFile.add(miFOpen);

    "Save", 's');

    oke(KeyEvent.VK_S, Event.CTRL_MASK, true ));mFile.add(miFSave);

    // Instantiate handler

    // Create menu bar

    // Assemble File menu:JMenu mFile = new JMenu("

    // File | NewJMenuItem miFNew = new JMenuItem(miFNew.addActionListener( mh );miFNew.setActionCommand(miFNew.setAccelerator(

    KeyStroke.getKeySt

    // File | OpenJMenuItem miFOpen = new JMenuItem(miFOpen.addActionListener( mh );miFOpen.setActionCommand("FileOpen");miFOpen.setAccelerator(

    KeyStroke.getKeyStr

    // File | SaveJMenuItem miFSave = new JMenuItem(miFSave.addActionListener( mh );miFSave.setActionCommand("FileSave");

    or(miFSave.setAcceleratKeyStroke.getKeyStr

    // Separatoror();

    ", 'x');

    and("FileExit");

    mFile.addSeparat

    // File | ExitJMenuItem miFExit = new JMenuItem("Exit

    tener( mh );miFExit.addActionLismiFExit.setActionComm mFile.add(miFExit);

    // Attach File m enu to menu barmb.add(mFile);

    Action ob jectsEdit");

    // Create Edit menu fromJMenu mEdit = new JMenu(" mEdit.setMnemonic('e');

    e };

    {[i]);

    Action actions[] = { actCut, actCopy, actPastint mnemonics[] = { 'c', 'o', 'p' };

    ; i++ )for( int i = 0; i < actions.lengthJMenuItem mi = mEdit.add(actions

    2003 SkillBuilders Inc. V 2.1

  • 8/14/2019 Java Swing v2.1 Workshop Solutions

    30/60

    Java SWing: Workshop Solutions Page xxviii

    mi.setMnemonic( mnemonics[i]);

    tion.SHORT_DESCRIPTION ).toString();mi.setToolTipText( s );

    }

    String s =actions[i].getValue( Ac

    mb.add(mEdit);

    Options");mOptions.setMnemonic('o');

    eckBoxMenuItem("Toolbar", true);

    ("OptionsToolbar");

    mOptions.add(miOToolbar);

    // Create Options menuJMenu mOptions = new JMenu("

    // Options | ToolbarJMenuItem miOToolbar = new JChmiOToolbar.setMnemonic('t');miOToolbar.addActionListener( mh );miOToolbar.setActionCommand

    em to Options menu

    "Text Font...", 'f');

    ("OptionsFont");mOptions.add(miOFont);

    getRootPane().setJMenuBar(mb);

    // Add separator & Font itmOptions.addSeparator();JMenuItem miOFont = new JMenuItem(miOFont.addActionListenmiOFont.setActionCommand

    er( mh );

    mb.add(mOptions);

    // Attach menubar to frame.

    }

    private void showStatus( String te xt ) {statusBar.showStatus( text );

    ", JLabel.LEFT );

    add( label_, BorderLayout.SOUTH );

    }

    // INNER CLASSES// Inner class for status bar

    extends JPanel {private class StatusBarprivate JLabel label_ = new JLabel( "public StatusBar() {

    setLayout( new BorderLayout() );setBackground( Color.lightGray );label_.setForeground( Color.black );

    }

    wStatus( String tex t ) {t( " " + text );

    public void sholabel_.setTex doLayout();

    }} // end of StatusBar class

    // Inner class for toolbar

    // private class ToolBar extends JPanel

    2003 SkillBuilders Inc. V 2.1

  • 8/14/2019 Java Swing v2.1 Workshop Solutions

    31/60

    Java SWing: Workshop Solutions Page xxix

    private class ToolBar extends JToolBarimplements ActionListener {

    e };i++ ) {

    = add(actions[i]);

    ctions[i].getValue( Action.SHORT_DESCRIPTION

    btn.setToolTipText( s );}

    public ToolBar() {// Add actions to the toolbar to create buttons.

    Action actions[] = { actCut, actCopy, actPastfor( int i = 0; i < actions.length;

    JButton btnString s =

    a).toString();

    /*JButton btnCut = new JButton("Cut");btnCut.setActionCommand("cut");btnCut.setMnemonic('c');btnCut.setToolTipText("Cut to clipboard");

    btnCut.addActionListener( this );

    JButton btnCopy = new JButton("Copy");btnCopy.setActionCommand("copy");btnCopy.setMnemonic('o');btnCopy.setToolTipText("Copy to clibtnCopy.addActionListener( this );

    pboard");

    JButton btnPaste = new JButton("Paste");btnPaste.setActionCommand("paste");btnPaste.setMnemonic('p');btnPaste.setToolTipText("Paste from clipboard");btnPaste.addActionListener( this );

    setBackground( Color.lightGray );FlowLayout( FlowLayout.LEFT ));setLayout( newadd( btnCut );add( btnCopy );add( btnPaste );

    */}

    s// Event handling for Cut, Copy and Paste button{public void actionPerformed( ActionEvent ae )

    ActionCommand().equals("cut") )if( ae.getcut();

    .getActionCommand().equals("copy") )else if( aecopy();

    getActionCommand().equals("paste") )else if( ae.paste();

    }} // end of ToolBar class

    // Login windownds JDialogprivate class LoginDialog exte

    implements ActionListener {

    boolean OKflag[];

    2003 SkillBuilders Inc. V 2.1

  • 8/14/2019 Java Swing v2.1 Workshop Solutions

    32/60

    Java SWing: Workshop Solutions Page xxx

    JLabel labelUID = new JLabel("User ID:", JLabel.RIGHT);JLabel labelPWD = new JLabel("Password:", JLabel.RIGHT);JTextField tfUID = new JTextField();JTextField tfPWD = new JTextField();JButton btnOK = new JButton("OK");

    JButton btnCancel = new JButton("Cancel");

    public LoginDialog( boolean[] OKflagI ) {super( MainWindow.this, "User Login", true );OKflag = OKflagI;initLayout();

    // Set up accelerators & mnemonics// For user ID field, use JTextField.setFocusAccelerator()tfUID.setFocusAccelerator( 'u' );labelUID.setDisplayedMnemonic( 'u' );

    // For password field, use JLabel.setLabelFor()labelPWD.setLabelFor( tfPWD );

    labelPWD.setDisplayedMnemonic( 'p' );

    // Set up action commandsbtnOK.setActionCommand("ok");btnCancel.setActionCommand("cancel");

    // Button event handling performed by LoginDialogbtnOK.addActionListener( this );btnCancel.addActionListener( this );

    /*// A simple anonymous adapter to handle// windowClosing event.

    addWindowListener( new WindowAdapter() { ndowEvent we ) {public void windowClosing( Wiwe.getWindow().dispose();

    }} );

    */// Use default closing mechanism to close dialogsetDefaultCloseOperation( JDialog.DISPOSE_ON_CLOSE );

    // Set font of entire frame just before showing.FontSetter.setFont( this, new Font("SansSerif", Font.PLAIN, 24)

    );

    show();}

    {public void actionPerformed( ActionEvent ae )ok") ) {if( ae.getActionCommand().equals("

    // Check if User ID is correctif( ! tfUID.getText().trim().toUpperCase().equals("STUDENT")

    ) {JOptionPane.showMessageDialog( null,

    gain.", "Invalid Login","Sorry, invalid user ID.\nTry aESSAGE );JOptionPane.WARNING_M

    tfUID.requestFocus();

    2003 SkillBuilders Inc. V 2.1

  • 8/14/2019 Java Swing v2.1 Workshop Solutions

    33/60

    Java SWing: Workshop Solutions Page xxxi

    tfUID.selectAll();return;

    }

    // Check if password is correct

    if( ! tfPWD.getText().trim().toUpperCase().equals("LEARN") ){

    JOptionPane.showMessageDialog( null,"Sorry, invalid password.\nTry again.", "Invalid Login",JOptionPane.WARNING_MESSAGE );

    tfPWD.requestFocus();tfPWD.selectAll();return;

    }

    OKflag[0] = true;}dispose();

    }

    private void initLayout() {GridBagLayout gbl = new GridBagLayout();GridBagConstraints gbc = new GridBagConstraints();getContentPane().setLayout( gbl );

    setBounds( 100, 100, 300, 200 ); // Size & position dialogsetResizable( false ); // Make dialog fixed size

    // Add UID label to login windowgbc.gridx = 0;gbc.gridy = 0;gbc.gridwidth = 2;gbc.gridheight = 1;

    gbc.weightx = 0;gbc.weighty = 1;gbc.anchor = GridBagConstraints.EAST;gbc.fill = GridBagConstraints.HORIZONTAL;

    ); // apply constraintsgbl.setConstraints( labelUID, gbcgetContentPane().add( labelUID );

    login window// Add PWD label togbc.gridx = 0;gbc.gridy = 1;gbc.gridwidth = 2;gbc.gridheight = 1;gbc.weightx = 0;gbc.weighty = 1;gbc.anchor = GridBagConstraints.EAST;gbc.fill = GridBagConstraints.HORIZONTAL;

    ); // apply constraintsgbl.setConstraints( labelPWD, gbcgetContentPane().add( labelPWD );

    d to login window// Add UID text fielgbc.gridx = 2;gbc.gridy = 0;gbc.gridwidth = 2;gbc.gridheight = 1;gbc.weightx = 1;

    2003 SkillBuilders Inc. V 2.1

  • 8/14/2019 Java Swing v2.1 Workshop Solutions

    34/60

    Java SWing: Workshop Solutions Page xxxii

    gbc.weighty = 1;gbc.anchor = GridBagConstraints.WEST;gbc.fill = GridBagConstraints.HORIZONTAL;gbl.setConstraints( tfUID, gbc ); // apply constraintsgetContentPane().add( tfUID );

    // Add PWD text field to login windowgbc.gridx = 2;gbc.gridy = 1;gbc.gridwidth = 2;gbc.gridheight = 1;gbc.weightx = 1;gbc.weighty = 1;gbc.anchor = GridBagConstraints.WEST;gbc.fill = GridBagConstraints.HORIZONTAL;gbl.setConstraints( tfPWD, gbc ); // apply constraintsgetContentPane().add( tfPWD );

    // Add OK button to login window

    gbc.gridx = 1;gbc.gridy = 2;gbc.gridwidth = 1;gbc.gridheight = 1;gbc.weightx = 0;gbc.weighty = 1;gbc.anchor = GridBagConstraints.CENTER;gbc.fill = GridBagConstraints.NONE;gbl.setConstraints( btnOK, gbc ); // apply constraintsgetContentPane().add( btnOK );

    // Add Cancel button to login windowgbc.gridx = 2;gbc.gridy = 2;

    gbc.gridwidth = 1;gbc.gridheight = 1;gbc.weightx = 1;gbc.weighty = 1;gbc.anchor = GridBagConstraints.CENTER;gbc.fill = GridBagConstraints.NONE;gbl.setConstraints( btnCancel, gbc ); // apply constraintsgetContentPane().add( btnCancel );

    tfUID.requestFocus(); // Put focus on ID field

    } // end of initLayout()

    } // end of LoginWindow class

    FontSetter is a convenience class. Its one staticg

    // end of MainWindow class}

    //// method, setFont(), is used to change the font settin// for all components in a container. This is simply

    s// to make the font bigger for display purposes; it ha// no bearing on the exercise.

    2003 SkillBuilders Inc. V 2.1

  • 8/14/2019 Java Swing v2.1 Workshop Solutions

    35/60

    Java SWing: Workshop Solutions Page xxxiii

    class FontSetter {// Change the font of the desired component and

    ned components and menus.{

    tMenuComponentCount(); i++)omponent(i), f );

    Container cont = (Container) c;ntCount(); i++)f );

    // all its contaipublic static void setFont( Component c, Font f )

    if( c instanceof JMenu ) {

    JMenu mnu = (JMenu) c;for(int i = 0; i < mnu.ge

    setFont( mnu.getMenuC}else if( c instanceof Container ) {

    for(int i = 0; i < cont.getComponesetFont( cont.getComponent(i),

    }c.setFont( f );

    }}

    2003 SkillBuilders Inc. V 2.1

  • 8/14/2019 Java Swing v2.1 Workshop Solutions

    36/60

    Java SWing: Workshop Solutions Page xxxiv

    Workshop 6: Using Borders

    SwingApp.java

    // SwingApp.java

    // After Borders exercise.

    import java.awt.*;import java.awt.event.*;import javax.swing.*;import javax.swing.border.*;import javax.swing.event.*;import javax.swing.text.JTextComponent;

    public class SwingApp {

    public static void main( String[] args ) {new MainWindow(args);}

    }

    class MainWindow extends JFrame {private ToolBar toolBar ;private StatusBar statusBar = new StatusBar();private JTextArea textArea = new JTextAreprivate Action actCut, actCopy, actPaste;

    a();

    // Constructorpublic MainWindow(String[] args) {

    oft Super System");super("StudentsinitActions();initLayout();initMenu();

    // Turn off default closing mechanismsetDefaultCloseOperation( JDialog.DO_NOTHING_ON_CLOSE );

    apter to handle// A simple anonymous ad// windowClosing event.

    2003 SkillBuilders Inc. V 2.1

  • 8/14/2019 Java Swing v2.1 Workshop Solutions

    37/60

    Java SWing: Workshop Solutions Page xxxv

    addWindowListener( new WindowAdapter() {public void windowClosing( WindowEvent we ) {

    quit(0);

    } );

    FontSetter.setFont( this, new Font("SansSerif", Font.PLAIN, 24) );

    }

    // Set font of entire frame just before showing.

    show();

    && args[0].toUpperCase().equals("LOGIN") ))

    quit(0);

    // Pop login dialog if "login" passed as 1st argument.// If user cancels or closes, close the application.if( args.length > 0

    if( ! login()

    showStatus( "Hello!" );}

    OK, false if user clicks Cancel

    n() {

    ew boolean[1];

    bOK);return bOK[0];

    showStatus("Text cut to clipboard");}

    showStatus("Text copied to clipboard");

    showStatus("Text pasted from clipboard");

    g Application",

    .YES_OPTION ) {tCode);

    urn true;

    return false;}

    // login() pops the LoginDialog, returns true if// user clicks// or closes.private boolean logi

    // return true;boolean bOK[] = nbOK[0] = false;new LoginDialog(

    }

    // Private methodsprivate void cut() {

    textArea.cut();

    private void copy() {textArea.copy();

    }

    private void paste() {textArea.paste();

    }

    private boolean quit(int retCode) {onfirmDialog( this,int intAnsw = JOptionPane.showC

    "Are you sure you want to exit?", "ExitinON );JOptionPane.YES_NO_OPTI

    OptionPaneif( intAnsw == JSystem.exit(re ret

    }else

    2003 SkillBuilders Inc. V 2.1

  • 8/14/2019 Java Swing v2.1 Workshop Solutions

    38/60

    Java SWing: Workshop Solutions Page xxxvi

    private boolean openFile() {JFileChooser fc = new JFileChooser();int intAnsw = fc.showOpenDialog(this);

    leChooser.CANCEL_OPTION )return false;

    // If user clicked cancel, return falseif( intAnsw == JFi

    pened file: " + fc.getSelectedFile() );return true;

    }

    showStatus( "O

    private boolean chooseFont( JTextComponent tc ) {// Compose array of font names.String fonts[] =

    GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames();

    Font curFont = tc.getFont(); // Get current settingObject oChoice = JOptionPane.showInputDialog( this,

    "Choose a font:", "Choose Font", Jnull, fonts, curFont.getName() );

    OptionPane.QUESTION_MESSAGE,

    if( oChoice == null )return false;

    tring) oChoice, curFont.getStyle(),tc.setFont( new Font( (ScurFont.getSize() ));

    tc.repaint();

    }

    return true;

    // Set up Action objectsprivate void initActions() {

    e:// Action objects for cut, copy, pastactCut = new AbstractAction("Cut") {

    d actionPerformed(ActionEvent ae) {public voicut();

    }};

    T_DESCRIPTION,actCut.putValue(Action.SHOR"Cut text to clipboard");

    actCopy = new AbstractAction("Copy") {actionPerformed(ActionEvent ae) {public void

    copy();}

    };T_DESCRIPTION,actCopy.putValue(Action.SHOR

    "Copy text to clipboard");

    actPaste = new AbstractAction("Paste") {actionPerformed(ActionEvent ae) {public void

    paste();}

    2003 SkillBuilders Inc. V 2.1

  • 8/14/2019 Java Swing v2.1 Workshop Solutions

    39/60

    Java SWing: Workshop Solutions Page xxxvii

    };actPaste.putValue(Action.SHORT_DESCRIPTION,

    "Paste text from clipboard");}

    private void initLayout() {toolBar = new ToolBar();

    // Configure text areatextArea.setLineWrap( true );textArea.setWrapStyleWord( true );textArea.setToolTipText("Enter / edit text here");textArea.setBorder( BorderFactory.createTitledBorder( "Workspace"

    ));

    // Configure framesetBounds( 100, 100, 500, 300 );getContentPane().add( BorderLayout.NORTH , toolBar );getContentPane().add( BorderLayout.CENTER, textArea );

    getContentPane().add( BorderLayout.SOUTH , statusBar );

    // Create caret listener for textArea to react when// selection changestextArea.addCaretListener( new CaretListene

    public void caretUpdate(CaretEvent e) {r() {

    boolean isSelection = textArea.getSelectionStart() !=textArea.getSelectionEnd();

    actCut.setEnabled(isSelection);actCopy.setEnabled(isSelection);

    }});

    }

    private void initMenu() {// Local inner class for handling menu itemsclass MenuHandler implements ActionListener {

    public void actionPerformed( ActionEvent ae ) {

    ileNew") )if( ae.getActionCommand().equals("FshowStatus("New file created");

    uals("FileOpen") )else if( ae.getActionCommand().eqs("File opened");// showStatu

    openFile();).equals("FileSave") )else if( ae.getActionCommand(

    showStatus("File saved");tActionCommand().equals("FileExit") )else if( ae.ge

    quit( 0 );

    // Toggle toolbar visibilityolbar") ) {else if( ae.getActionCommand().equals("OptionsTo

    // Get source, cast it as JCheckBoxMenuItem:JCheckBoxMenuItem cbmi = (JCheckBoxMenuItem)

    ae.getSource();lected() );toolBar.setVisible( cbmi.isSe

    getContentPane().doLayout();}

    2003 SkillBuilders Inc. V 2.1

  • 8/14/2019 Java Swing v2.1 Workshop Solutions

    40/60

    Java SWing: Workshop Solutions Page xxxviii

    // Set font on text areaelse if( ae.getActionCommand().equals("OptionsFont") )

    chooseFont(textArea);

    }

    }

    // Instantiate handlerMenuHandler mh = new MenuHandler();

    // Create menu barJMenuBar mb = new JMenuBar();

    // Assemble File menu:JMenu mFile = new JMenu("File");mFile.setMnemonic('f');

    // File | NewJMenuItem miFNew = new JMenuItem("New", 'n');

    miFNew.addActionListener( mh );miFNew.setActionCommand("FileNew");miFNew.setAccelerator(

    KeyStroke.getKeyStroke(KeyEvent.VK_N, Event.CTRL_MASK, true ));mFile.add(miFNew);

    // File | OpenJMenuItem miFOpen = new JMenuItem("Open", 'o');miFOpen.addActionListener( mh );miFOpen.setActionCommand("FileOpen");miFOpen.setAccelerator(

    KeyStroke.getKeyStroke(KeyEvent.VK_O, Event.CTRL_MASK, true ));mFile.add(miFOpen);

    // File | Save ("Save", 's');JMenuItem miFSave = new JMenuItemmiFSave.addActionListener( mh );miFSave.setActionCommand("FileSave");miFSave.setAccelerator(

    roke(KeyEvent.VK_S, Event.CTRL_MASK, true ));KeyStroke.getKeyStmFile.add(miFSave);

    // SeparatormFile.addSeparator();

    // File | Exit("Exit", 'x');JMenuItem miFExit = new JMenuItem

    miFExit.addActionListener( mh );mand("FileExit");miFExit.setActionCom

    mFile.add(miFExit);

    menu to menu bar// Attach Filemb.add(mFile);

    bjects// Create Edit menu from Action o"Edit");JMenu mEdit = new JMenu(

    mEdit.setMnemonic('e');

    2003 SkillBuilders Inc. V 2.1

  • 8/14/2019 Java Swing v2.1 Workshop Solutions

    41/60

    Java SWing: Workshop Solutions Page xxxix

    Action actions[] = { actCut, actCopy, actPaste };int mnemonics[] = { 'c', 'o', 'p' };for( int i = 0; i < actions.length; i++ ) {

    JMenuItem mi = mEdit.add(actions[i]);mi.setMnemonic( mnemonics[i]);

    String s =actions[i].getValue( Action.SHORT_DESCRIPTION ).toString();

    mi.setToolTipText( s );}

    mb.add(mEdit);

    // Create Options menuJMenu mOptions = new JMenu("Options");mOptions.setMnemonic('o');

    // Options | Toolbar

    JMenuItem miOToolbar = new JCheckBoxMenuItem("Toolbar", true);miOToolbar.setMnemonic('t');miOToolbar.addActionListener( mh );miOToolbar.setActionCommand("OptionsToolbar");mOptions.add(miOToolbar);

    // Add separator & Font item to Options menumOptions.addSeparator();JMenuItem miOFont = new JMenuItem("Text Font...", 'f');miOFont.addActionListener( mh );

    d("OptionsFont");miOFont.setActionCommanmOptions.add(miOFont);

    mb.add(mOptions);

    // Attach menubar to frame.getRootPane().setJMenuBar(mb);

    }

    ext ) {private void showStatus( String tstatusBar.showStatus( text );

    }

    // INNER CLASSES// Inner class for status barprivate class StatusBar extends JPanel {

    = new JLabel( "", JLabel.LEFT );private JLabel labelpublic StatusBar() {

    setLayout( new BorderLayout() );setBackground( Color.lightGray );label.setForeground( Color.black );

    ateLoweredBevelBorder());label.setBorder( BorderFactory.creadd( label, BorderLayout.SOUTH );

    }

    ext ) {public void showStatus( String tt( " " + text );label.setTex

    doLayout();

    2003 SkillBuilders Inc. V 2.1

  • 8/14/2019 Java Swing v2.1 Workshop Solutions

    42/60

    Java SWing: Workshop Solutions Page xl

    }} // end of StatusBar class

    // Inner class for toolbar// private class ToolBar extends JPanel

    private class ToolBar extends JToolBarimplements ActionListener {

    public ToolBar() {// Add actions to the toolbar to create buttons.Action actions[] = { actCut, actCopy, actPaste };for( int i = 0; i < actions.length; i++ ) {

    JButton btn = add(actions[i]);String s =

    actions[i].getValue( Action.SHORT_DESCRIPTION).toString();

    btn.setToolTipText( s );}

    /* JButton btnCut = new JButton("Cut");btnCut.setActionCommand("cut");btnCut.setMnemonic('c');btnCut.setToolTipText("Cut to clipboard");btnCut.addActionListener( this );

    JButton btnCopy = new JButton("Copy");btnCopy.setActionCommand("copy");btnCopy.setMnemonic('o');

    pboard");btnCopy.setToolTipText("Copy to clibtnCopy.addActionListener( this );

    JButton btnPaste = new JButton("Past

    paste");

    e");

    btnPaste.setActionCommand("btnPaste.setMnemonic('p');btnPaste.setToolTipText("Paste from clipboard");btnPaste.addActionListener( this );

    setBackground( Color.lightGray );FlowLayout( FlowLayout.LEFT ));setLayout( new

    add( btnCut );add( btnCopy );add( btnPaste );

    */}

    s// Event handling for Cut, Copy and Paste button{public void actionPerformed( ActionEvent ae )

    ActionCommand().equals("cut") )if( ae.getcut();

    .getActionCommand().equals("copy") )else if( aecopy();

    getActionCommand().equals("paste") )else if( ae.paste();

    }} // end of ToolBar class

    2003 SkillBuilders Inc. V 2.1

  • 8/14/2019 Java Swing v2.1 Workshop Solutions

    43/60

    Java SWing: Workshop Solutions Page xli

    // Login windowprivate class LoginDialog extends JDialog

    implements ActionListener {

    boolean OKflag[];

    JLabel labelUID = new JLabel("User ID:", JLabel.RIGHT);JLabel labelPWD = new JLabel("Password:", JLabel.RIGHT);JTextField tfUID = new JTextField();JTextField tfPWD = new JTextField();JButton btnOK = new JButton("OK");JButton btnCancel = new JButton("Cancel");

    public LoginDialog( boolean[] OKflagI ) {super( MainWindow.this, "User Login", true );OKflag = OKflagI;initLayout();

    // Set up accelerators & mnemonics// For user ID field, use JTextField.setFocusAccelerator()

    tfUID.setFocusAccelerator( 'u' );labelUID.setDisplayedMnemonic( 'u' );

    // For password field, use JLabel.setLabelFor()labelPWD.setLabelFor( tfPWD );labelPWD.setDisplayedMnemonic( 'p' );

    // Set up action commandsbtnOK.setActionCommand("ok");btnCancel.setActionCommand("cancel");

    // Button event handling performed by LoginDialogbtnOK.addActionListener( this );

    btnCancel.addActionListener( this );

    /*// A simple anonymous adapter to handle// windowClosing event.addWindowListener( new WindowAdapter() {

    ndowEvent we ) {public void windowClosing( Wiwe.getWindow().dispose();

    }} );

    */// Use default closing mechanism to close dialogsetDefaultCloseOperation( JDialog.DISPOSE_ON_CLOSE );

    // Set font of entire frame just before showing.FontSetter.setFont( this, new Font("SansSerif", Font.PLAIN, 24)

    );

    show();}

    {public void actionPerformed( ActionEvent ae )ok") ) {if( ae.getActionCommand().equals("

    // Check if User ID is correct

    2003 SkillBuilders Inc. V 2.1

  • 8/14/2019 Java Swing v2.1 Workshop Solutions

    44/60

    Java SWing: Workshop Solutions Page xlii

    if( ! tfUID.getText().trim().toUpperCase().equals("STUDENT")) {

    JOptionPane.showMessageDialog( null,"Sorry, invalid user ID.\nTry again.", "Invalid Login",JOptionPane.WARNING_MESSAGE );

    tfUID.requestFocus();tfUID.selectAll();return;

    }

    // Check if password is correctif( ! tfPWD.getText().trim().toUpperCase().equals("LEARN") )

    {JOptionPane.showMessageDialog( null,

    "Sorry, invalid password.\nTry again.", "Invalid Login",JOptionPane.WARNING_MESSAGE );

    tfPWD.requestFocus();tfPWD.selectAll();return;

    }

    OKflag[0] = true;}dispose();

    }

    private void initLayout() {GridBagLayout gbl = new GridBagLayout();GridBagConstraints gbc = new GridBagetContentPane().setLayout( gbl );

    gConstraints();

    setBounds( 100, 100, 300, 200 ); // Size & position dialogsetResizable( false ); // Make dialog fixed size

    login window// Add UID label togbc.gridx = 0;gbc.gridy = 0;gbc.gridwidth = 2;gbc.gridheight = 1;gbc.weightx = 0;gbc.weighty = 1;gbc.anchor = GridBagConstraints.EAST;gbc.fill = GridBagConstraints.HORIZONTAL;

    ); // apply constraintsgbl.setConstraints( labelUID, gbcgetContentPane().add( labelUID );

    login window// Add PWD label togbc.gridx = 0;gbc.gridy = 1;gbc.gridwidth = 2;gbc.gridheight = 1;gbc.weightx = 0;gbc.weighty = 1;gbc.anchor = GridBagConstraints.EAST;gbc.fill = GridBagConstraints.HORIZONTAL;

    ); // apply constraintsgbl.setConstraints( labelPWD, gbcgetContentPane().add( labelPWD );

    2003 SkillBuilders Inc. V 2.1

  • 8/14/2019 Java Swing v2.1 Workshop Solutions

    45/60

    Java SWing: Workshop Solutions Page xliii

    // Add UID text field to login windowgbc.gridx = 2;gbc.gridy = 0;gbc.gridwidth = 2;gbc.gridheight = 1;

    gbc.weightx = 1;gbc.weighty = 1;gbc.anchor = GridBagConstraints.WEST;gbc.fill = GridBagConstraints.HORIZONTAL;gbl.setConstraints( tfUID, gbc ); // apply constraintsgetContentPane().add( tfUID );

    // Add PWD text field to login windowgbc.gridx = 2;gbc.gridy = 1;gbc.gridwidth = 2;gbc.gridheight = 1;gbc.weightx = 1;gbc.weighty = 1;

    gbc.anchor = GridBagConstraints.WEST;gbc.fill = GridBagConstraints.HORIZONTAL;gbl.setConstraints( tfPWD, gbc ); // apply constraintsgetContentPane().add( tfPWD );

    // Add OK button togbc.gridx = 1;

    login window

    gbc.gridy = 2;gbc.gridwidth = 1;gbc.gridheight = 1;gbc.weightx = 0;gbc.weighty = 1;gbc.anchor = GridBagConstraints.CENTER;gbc.fill = GridBagConstraints.NONE;

    ); // apply constraintsgbl.setConstraints( btnOK, gbcgetContentPane().add( btnOK );

    // Add Cancel button to login windowgbc.gridx = 2;gbc.gridy = 2;gbc.gridwidth = 1;gbc.gridheight = 1;gbc.weightx = 1;gbc.weighty = 1;

    ;gbc.anchor = GridBagConstraints.CENTERgbc.fill = GridBagConstraints.NONE;

    ); // apply constraintsgbl.setConstraints( btnCancel, gbcgetContentPane().add( btnCancel );

    tfUID.requestFocus(); // Put focus on ID field

    } // end of initLayout()

    } // end of LoginWindow class

    // end of MainWindow class}

    2003 SkillBuilders Inc. V 2.1

  • 8/14/2019 Java Swing v2.1 Workshop Solutions

    46/60

    Java SWing: Workshop Solutions Page xliv

    // FontSetter is a convenience class. Its one static// method, setFont(), is used to change the font setting// for all components in a container. This is simply// to make the font bigger for display purposes; it has// no bearing on the exercise.

    class FontSetter {// Change the font of the desired component and// all its contained components and menus.public static void setFont( Component c, Font f ) {

    if( c instanceof JMenu ) {JMenu mnu = (JMenu) c;for(int i = 0; i < mnu.getMenuComponentCount(); i++)

    setFont( mnu.getMenuComponent(i), f );}else if( c instanceof Container ) {

    Container cont = (Container) c;for(int i = 0; i < cont.getComponentCount(); i++)

    setFont( cont.getComponent(i), f );

    }c.setFont( f );}

    }

    2003 SkillBuilders Inc. V 2.1

  • 8/14/2019 Java Swing v2.1 Workshop Solutions

    47/60

    Java SWing: Workshop Solutions Page xlv

    Workshop 7: Using Internal Frames

    SwingApp.java

    // SwingApp.java

    // After Internal Frames exercise.

    import java.awt.*;import java.awt.event.*;import javax.swing.*;import javax.swing.border.*;import javax.swing.event.*;import javax.swing.text.JTextComponent;

    public class SwingApp {

    public static void main( String[] args ) {new MainWindow(args);}

    }

    class MainWindow extends JFrame {private ToolBar toolBar_ ;private StatusBar statusBar_ = new StatusBar();private JTextArea textArea_; // = new JTextprivate Action actCut_, actCopy_, actPaste_;

    Area();

    private JDesktopPane desktop_ = new JDesktopPane();private int intNewFileCounter;

    // Constructorpublic MainWindow(String[] args) {super("Studentsoft Super System");initActions();

    ;initLayout()initMenu();

    // Turn off default closing mechanismsetDefaultCloseOperation( JDialog.DO_NOTHING_ON_CLOSE );

    2003 SkillBuilders Inc. V 2.1

  • 8/14/2019 Java Swing v2.1 Workshop Solutions

    48/60

    Java SWing: Workshop Solutions Page xlvi

    // A simple anonymous adapter to handle

    indowClosing( WindowEvent we ) {quit(0);

    } );

    FontSetter.setFont( this, new Font("SansSerif", Font.PLAIN, 24) );

    // windowClosing event.addWindowListener( new WindowAdapter() {

    public void w

    }

    // Set font of entire frame just before showing.

    ow();

    && args[0].toUpperCase().equals("LOGIN") ))

    quit(0);

    sh

    // Pop login dialog if "login" passed as 1st argument.// If user cancels or closes, close the application.if( args.length > 0

    if( ! login()

    showStatus( "Hello!" );}

    OK, false if user clicks Cancel

    n() {

    ew boolean[1];

    return bOK[0];}

    showStatus("Text cut to clipboard");

    showStatus("Text copied to clipboard");

    showStatus("Text pasted from clipboard");

    g Application",

    .YES_OPTION ) {tCode);

    urn true;

    // login() pops the LoginDialog, returns true if// user clicks// or closes.private boolean logi

    // return true;boolean bOK[] = nbOK[0] = false;new LoginDialog(bOK);

    // Private methodsprivate void cut() {textArea_.cut();

    }

    private void copy() {textArea_.copy();

    }

    private void paste() {textArea_.paste();

    }

    private boolean quit(int retCode) {onfirmDialog( this,int intAnsw = JOptionPane.showC

    "Are you sure you want to exit?", "ExitinON );JOptionPane.YES_NO_OPTI

    OptionPaneif( intAnsw == JSystem.exit(re ret

    }else

    2003 SkillBuilders Inc. V 2.1

  • 8/14/2019 Java Swing v2.1 Workshop Solutions

    49/60

    Java SWing: Workshop Solutions Page xlvii

    return false;}

    ew NotepadChild( title ); _.add( pad );

    pad.setSelected(true); // Make it the active notepad

    catch( Exception e ) {}}

    newChild( "Untitled " + ++intNewFileCounter );}

    t intAnsw = fc.showOpenDialog(this);

    leChooser.CANCEL_OPTION )

    pened file: " + fc.getSelectedFile() );return true;

    }

    private void newChild( String title ) {

    JInternalFrame pad = ndesktoptry {

    }

    private void newFile() {

    private boolean openFile() {JFileChooser fc = new JFileChooser();

    in // If user clicked cancel, return falseif( intAnsw == JFi

    return false;newChild( fc.showStatus( "O

    getSelectedFile().toString() );

    private boolean chooseFont( JTextCom ponent tc ) {font names.

    vironment.getLocalGraphicsEnvironment().getAvailableFontFamilymes();

    ptionPane.QUESTION_MESSAGE,getName() );

    // Compose array ofString fonts[] =

    aphicsEnGrNa

    Font curFont = tc.getFont(); // Get current settingutDialog( this,Object oChoice = JOptionPane.showInp

    "Choose a font:", "Choose Font", JO null, fonts, curFont.

    l )if( oChoice == nul

    return false;tring) oChoice, curFont.getStyle(),tc.setFont( new Font( (S

    ize() ));curFont.getS tc.repaint();

    return true;}

    // Set up Action objectsprivate void initActions() {

    :// Action objects for cut, copy, pasteactCut_ = new AbstractAction("Cut") {

    d actionPerformed(ActionEvent ae) {public voicut();

    }};

    2003 SkillBuilders Inc. V 2.1

  • 8/14/2019 Java Swing v2.1 Workshop Solutions

    50/60

    Java SWing: Workshop Solutions Page xlviii

    actCut_.putValue(Action.SHORT_DESCRIPTION,"Cut text to clipboard");

    actCopy_ = new AbstractAction("Copy") {t ae) {

    py_.putValue(Action.SHORT_DESCRIPTION,

    public void actionPerformed(ActionEven

    copy();}

    };actCo

    "Copy text to clipboard");

    actPaste_ = new AbstractAction("Paste") {ae) {

    ste_.putValue(Action.SHORT_DESCRIPTION,

    public void actionPerformed(ActionEventpaste();

    }};

    actPa"Paste text from clipboard");

    }

    private void initLayout() {

    rue ););

    t text here");

    toolBar_ = new ToolBar();

    /*// Configure text areatextArea_.setLineWrap( ttextArea_.setWrapStyleWord( truetextArea_.setToolTipText("Enter / editextArea_.setBorder( BorderFactory.createTitledBorder( "Workspace"

    ));*/

    // Configure frame

    setBounds( 100, 100, 500, 300 );getContentPane().add( BorderLayout.NORTH , toolBar_ );// getContentPane().add( BorderLayout.CENTER, textArea_ );

    getContentPane().add( BorderLayout.CENTER, desktop_ );getContentPane().add( BorderLayout.SOUTH , statusBar_ );

    /*// Create caret listener for textArea_ to react when// selection changestextArea_.addCaretListener( new CaretListener() {

    public void caretUpdate(CaretEvent e) {boolean isSelection = textArea_.getSelectionStart() !=

    textArea_.getSelectionEnd();actCut_.setEnabled(isSelection);actCopy_.setEnabled(isSelection);

    }});

    */}

    private void initMenu() {// Local inner class for handling menu itemsclass MenuHandler implements ActionListener {

    public void actionPerformed( ActionEvent ae ) {

    2003 SkillBuilders Inc. V 2.1

  • 8/14/2019 Java Swing v2.1 Workshop Solutions

    51/60

    Java SWing: Workshop Solutions Page xlix

    if( ae.getActionCommand().equals("FileNew") ) {

    New file created");

    e if( ae.getActionCommand().equals("FileOpen") )

    ctionCommand().equals("FileSave") )

    .equals("FileExit") )

    Toggle toolbar visibility.equals("OptionsToolbar") ) {

    olBar_.setVisible( cbmi.isSelected() );

    newFile();showStatus("

    }els

    // showStatus("File opened");openFile();

    else if( ae.getAshowStatus("File saved");

    else if( ae.getActionCommand()quit( 0 );

    //else if( ae.getActionCommand()

    // Get source, cast it as JCheckBoxMenuItem:JCheckBoxMenuItem cbmi = (JCheckBoxMenuItem)

    ae.getSource();togetContentPane().doLayout();

    }

    // Set font on text areand().equals("OptionsFont") )else if( ae.getActionComma

    chooseFont(textArea_);

    }}

    // Instantiate handlerMenuHandler mh = new MenuHandler();

    // Create menu bar

    "File");

    ");

    JMenuBar mb = new JMenuBar();

    // Assemble File menu:JMenu mFile = new JMenu(mFile.setMnemonic('f');

    // File | NewJMenuItem miFNew = new JMenuItem("New", 'n');miFNew.addActionListener( mh );miFNew.setActionCommand("FileNew");miFNew.setAccelerator(

    KeyStroke.getKeyStroke(KeyEvent.VK_N, Event.CTRL_MASK, true ));mFile.add(miFNew);

    // File | OpenJMenuItem miFOpen = new JMenuItem("Open", 'o');miFOpen.addActionListener( mh );miFOpen.setActionCommand("FileOpen");miFOpen.setAccelerator(

    KeyStroke.getKeyStroke(KeyEvent.VK_O, Event.CTRL_MASK, true ));mFile.add(miFOpen);

    // File | SaveJMenuItem miFSave = new JMenuItem("Save", 's');miFSave.addActionListener( mh );miFSave.setActionCommand("FileSave

    2003 SkillBuilders Inc. V 2.1

  • 8/14/2019 Java Swing v2.1 Workshop Solutions

    52/60

    Java SWing: Workshop Solutions Page l

    miFSave.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_S, Event.CTRL_MASK, true ));

    mFile.add(miFSave);

    // Separator

    ator();mFile.addSepar

    // File | Exitt = new JMenuItem("Exit", 'x');

    ");

    JMenuItem miFEximiFExit.addActionListener( mh );miFExit.setActionCommand("FileExitmFile.add(miFExit);

    // Attach File menu to menu barmb.add(mFile);

    // Create Edit menu from Action objectsJMenu mEdit = new JMenu("Edit");

    mEdit.setMnemonic('e');

    Action actions[] = { actCut_, actCopy_, actPaste_ };

    {

    getValue( Action.SHORT_DESCRIPTION ).toString();

    int mnemonics[] = { 'c', 'o', 'p' };for( int i = 0; i < actions.length; i++ )

    JMenuItem mi = mEdit.add(actions[i]);mi.setMnemonic( mnemonics[i]);String s =

    actions[i].mi.setToolTipText( s );

    }

    mb.add(mEdit);

    // Create Options menuJMenu mOptions = new JMenu("Options");mOptions.setMnemonic('o');

    // Options | ToolbarJMenuItem miOToolbar = new JCheckBoxMenuItem("Toolbar", true);miOToolbar.setMnemonic('t');miOToolbar.addActionListener( mh );miOToolbar.setActionCommand("OptionsToolbar");mOptions.add(miOToolbar);

    // Add separator & Font item to Options menumOptions.addSeparator();JMenuItem miOFont = new JMenuItem("Text Font...", 'f');miOFont.addActionListener( mh );miOFont.setActionCommand("OptionsFont");mOptions.add(miOFont);

    mb.add(mOptions);

    // Attach menubar to frame.getRootPane().setJMenuBar(mb);

    2003 SkillBuilders Inc. V 2.1

  • 8/14/2019 Java Swing v2.1 Workshop Solutions

    53/60

    Java SWing: Workshop Solutions Page li

    }

    private void showStatus( String text ) {statusBar_.showStatus( text );

    }

    // INNER CLASSESstatus bar

    JPanel {JLabel.LEFT );

    erLayout() );

    ;LoweredBevelBorder());

    // Inner class forprivate class StatusBar extends

    private JLabel label_ = new JLabel( "",public StatusBar() {

    setLayout( new BordsetBackground( Color.lightGray );label_.setForeground( Color.black )label_.setBorder( BorderFactory.createadd( label_, BorderLayout.SOUTH );

    }

    public void showStatus( String text ) {

    end of StatusBar class

    nds JPanel

    the toolbar to create buttons.};

    getValue( Action.SHORT_DESCRIPTION

    label_.setText( " " + text );doLayout();}

    } //

    // Inner class for toolbar// private class ToolBar exte

    private class ToolBar extends JToolBarimplements ActionListener {

    public ToolBar() {// Add actions toAction actions[] = { actCut_, actCopy_, actPaste_for( int i = 0; i < actions.length; i++ ) {

    JButton btn = add(actions[i]);String s =actions[i].

    ).toString();btn.setToolTipText( s );

    }

    /*JButton btnCut = new JButton("Cut");btnCut.setActionCommand("cut");btnCut.setMnemonic('c');btnCut.setToolTipText("Cut to clipboard");btnCut.addActionListener( this );

    JButton btnCopy = new JButton("Copy");btnCopy.setActionCommand("copy");btnCopy.setMnemonic('o');btnCopy.setToolTipText("Copy to clipboard");btnCopy.addActionListener( this );

    JButton btnPaste = new JButton("Paste");btnPaste.setActionCommand("paste");btnPaste.setMnemonic('p');btnPaste.setToolTipText("Paste from clipboard");btnPaste.addActionListener( this );

    2003 SkillBuilders Inc. V 2.1

  • 8/14/2019 Java Swing v2.1 Workshop Solutions

    54/60

    Java SWing: Workshop Solutions Page lii

    setBackground( Color.lightGray );ut.LEFT ));

    }

    setLayout( new FlowLayout( FlowLayoadd( btnCut );add( btnCopy );

    add( btnPaste );*/

    // Event handling for Cut, Copy and Paste buttons

    .getActionCommand().equals("copy") )

    getActionCommand().equals("paste") )

    end of ToolBar class

    public void actionPerformed( ActionEvent ae ) {if( ae.getActionCommand().equals("cut") )

    cut();else if( ae

    copy();else if( ae.

    paste();}

    } //

    // Login windowinDialog extends JDialogprivate class Log

    implements ActionListener {

    boolean OKflag_[];new JLabel("User ID:", JLabel.RIGHT);

    );

    // A simple anonymous adapter to handle

    JLabel labelUID_ =JLabel labelPWD_ = new JLabel("Password:", JLabel.RIGHT);JTextField tfUID_ = new JTextField();JTextField tfPWD_ = new JTextField();JButton btnOK_ = new JButton("OK");JButton btnCancel_ = new JButton("Cancel"

    public LoginDialog( boolean[] OKflag ) {super( MainWindow.this, "User Login", true );OKflag_ = OKflag;initLayout();

    // Set up accelerators & mnemonics// For user ID field, use JTextField.setFocusAccelerator()tfUID_.setFocusAccelerator( 'u' );labelUID_.setDisplayedMnemonic( 'u' );

    // For password field, use JLabel.setLabelFor()labelPWD_.setLabelFor( tfPWD_ );labelPWD_.setDisplayedMnemonic( 'p' );

    // Set up action commandsbtnOK_.setActionCommand("ok");btnCancel_.setActionCommand("cancel");

    // Button event handling performed by LoginDialogbtnOK_.addActionListener( this );btnCancel_.addActionListener( this );

    /*

    2003 SkillBuilders Inc. V 2.1

  • 8/14/2019 Java Swing v2.1 Workshop Solutions

    55/60

    Java SWing: Workshop Solutions Page liii

    // windowClosing event.addWindowListener( new WindowAdapter() {

    we ) {

    // Use default closing mechanism to close dialog);

    public void windowClosing( WindowEventwe.getWindow().dispose();

    }

    } );*/

    setDefaultCloseOperation( JDialog.DISPOSE_ON_CLOSE

    // Set font of entire frame just before showing.nt.PLAIN, 24)FontSetter.setFont( this, new Font("SansSerif", Fo

    );

    show();}

    public void actionPerformed( ActionEvent ae ) {

    UpperCase().equals("ALICE")

    JOptionPane.showMessageDialog( null,"Invalid Login",

    if( ae.getActionCommand().equals("ok") ) {

    // Check if User ID is correctif( ! tfUID_.getText().trim().to) {

    "Sorry, invalid user ID.\nTry again.",JOptionPane.WARNING_MESSAGE );

    tfUID_.requestFocus();tfUID_.selectAll();return;

    }

    // Check if password is correctpperCase().equals("DRINKif( ! tfPWD_.getText().trim().toU

    ME") ) {

    JOptionPane.showMessageDialog( null,"Sorry, invalid password.\nTry again.", "Invalid Login",JOptionPane.WARNING_MESSAGE );

    tfPWD_.requestFocus();tfPWD_.selectAll();return;

    }

    OKflag_[0] = true;}dispose();

    }

    private void initLayout() {GridBagLayout gbl = new GridBagLayout();GridBagConstraints gbc = new GridBagConstraints();getContentPane().setLayout( gbl );

    setBounds( 100, 100, 300, 200 ); // Size & position dialogsetResizable( false ); // Make dialog fixed size

    // Add UID label to login windowgbc.gridx = 0;gbc.gridy = 0;gbc.gridwidth = 2;

    2003 SkillBuilders Inc. V 2.1

  • 8/14/2019 Java Swing v2.1 Workshop Solutions

    56/60

    Java SWing: Workshop Solutions Page liv

    gbc.gridheight = 1;gbc.weightx = 0;gbc.weighty = 1;gbc.anchor = GridBagConstraints.EAST;

    TAL;

    onstraints

    gbc.fill = GridBagConstraints.HORIZON

    gbl.setConstraints( labelUID_, gbc ); // apply cgetContentPane().add( labelUID_ );

    // Add PWD label to login window

    BagConstraints.EAST;TAL;

    onstraints

    gbc.gridx = 0;gbc.gridy = 1;gbc.gridwidth = 2;gbc.gridheight = 1;gbc.weightx = 0;gbc.weighty = 1;gbc.anchor = Gridgbc.fill = GridBagConstraints.HORIZONgbl.setConstraints( labelPWD_, gbc ); // apply cgetContentPane().add( labelPWD_ );

    // Add UID text field to login window

    BagConstraints.WEST;

    gbc.gridx = 2;gbc.gridy = 0;gbc.gridwidth = 2;gbc.gridheight = 1;gbc.weightx = 1;gbc.weighty = 1;gbc.anchor = Gridgbc.fill = GridBagConstraints.HORIZONTAL;gbl.setConstraints( tfUID_, gbc ); // apply constraintsgetContentPane().add( tfUID_ );

    // Add PWD text field to login window

    gbc.gridx = 2;gbc.gridy = 1;gbc.gridwidth = 2;gbc.gridheight = 1;gbc.weightx = 1;gbc.weighty = 1;gbc.anchor = GridBagConstraints.WEST;gbc.fill = GridBagConstraints.HORIZONTAL;gbl.setConstraints( tfPWD_, gbc ); // apply constraintsgetContentPane().add( tfPWD_ );

    // Add OK button to login windowgbc.gridx = 1;gbc.gridy = 2;gbc.gridwidth = 1;gbc.gridheight = 1;gbc.weightx = 0;gbc.weighty = 1;gbc.anchor = GridBagConstraints.CENTER;gbc.fill = GridBagConstraints.NONE;gbl.setConstraints( btnOK_, gbc ); // apply constraintsgetContentPane().add( btnOK_ );

    // Add Cancel button to login windowgbc.gridx = 2;

    2003 SkillBuilders Inc. V 2.1

  • 8/14/2019 Java Swing v2.1 Workshop Solutions

    57/60

    Java SWing: Workshop Solutions Page lv

    gbc.gridy = 2;gbc.gridwidth = 1;gbc.gridheight = 1;gbc.weightx = 1;gbc.weighty = 1;

    gbc.anchor = GridBagConstraints.CENTER;

    apply constraintsgbc.fill = GridBagConstraints.NONE;gbl.setConstraints( btnCancel_, gbc ); //getContentPane().add( btnCancel_ );

    tfUID_.requestFocus(); // Put focus on ID field

    } // end of initLayout()

    } // end of LoginWindow class

    // NotepadChild class is the internal frame rame {private class NotepadChild extends JInternalFprivate JTextArea textArea_ = new JTextArea();

    public NotepadChild( String title ) {super( title, true, true, true, true );

    // Configure text arearue );

    );24)

    textArea_.setLineWrap( ttextArea_.setWrapStyleWord( true );textArea_.setToolTipText("Enter / edit text here");getContentPane().add( BorderLayout.CENTER, textArea_FontSetter.setFont( this, new Font("SansSerif", Font.PLAIN,

    );

    pack();setBounds( 50, 50, 300, 150 );

    // Register a simple adapter to handle when internal frame// becomes active.addInternalFrameListener( new InternalFrameAdapter(){

    public void internalFrameActivated(InternalFrameEvent e) {// Assign my text area as the one referenced by

    MainWindowMainWindow.this.textArea_ = textArea_;

    }});

    // Create caret listener for textArea_ to react when// selection changestextArea_.addCaretListener( new CaretListener() {

    public void caretUpdate(CaretEvent e) {boolean isSelection = textArea_.getSelectionStart() !=

    textArea_.getSelectionEnd();actCut_.setEnabled(isSelection);actCopy_.setEnabled(isSelection);

    }});

    } // end of NotepadChild ctor

    2003 SkillBuilders Inc. V 2.1

  • 8/14/2019 Java Swing v2.1 Workshop Solutions

    58/60

    Java SWing: Workshop Solutions Page lvi

    } // end of NotepadChild class

    } // end of MainWindow class

    FontSetter is a convenience class. Its one staticg

    ass FontSetter {t of the desired component and

    t f ) {

    etMenuComponentCount(); i++)

    e if( c instanceof Container ) {

    entCount(); i++)

    //// method, setFont(), is used to change the font settin// for all components in a container. This is simply// to make the font bigger for display purposes; it has// no bearing on the exercise.

    cl// Change the fon// all its contained components and menus.public static void setFont( Component c, Fon

    if( c instanceof JMenu ) {

    JMenu mnu = (JMenu) c;for(int i = 0; i < mnu.gsetFont( mnu.getMenuComponent(i), f );

    }els

    Container cont = (Container) c;for(int i = 0; i < cont.getCompon

    setFont( cont.getComponent(i), f );}c.setFont( f );

    }}

    2003 SkillBuilders Inc. V 2.1

  • 8/14/2019 Java Swing v2.1 Workshop Solutions

    59/60

    Java SWing: Workshop Solutions Page lvii

    Workshop 8: Using a List Model

    ListDemo.java

    // ListDemo.java

    // ListModel Exercise

    import java.awt.*;import java.awt.event.*;import javax.swing.*;

    class ListDemo extends JFrame {private JTextField text_ = new JTextField();private DefaultListModel model_ = new DefaultListModel();

    public static void main(String[] args) {new ListDemo(args);

    }

    private ListDemo(String[] args) {super("JList & ListModel Demonstration");JList list = new JList();getContentPane().add(BorderLayout.NORTH, text_);getContentPane().add(BorderLayout.CENTER, new JSJButton btn = new JButton("Add Name to Model");

    crollPane(list));

    getContentPane().add(BorderLayout.SOUTH, btn);pack();

    // Button event handlerbtn.addActionListener( new ActionListener() {public void actionPerformed( ActionEvent ae ) {

    model_.addElement( text_.getText() );text_.setText("");

    ext_.requestFocus();t}

    });

    s into the model// Load a few name

    2003 SkillBuilders Inc. V 2.1

  • 8/14/2019 Java Swing v2.1 Workshop Solutions

    60/60

    Java SWing: Workshop Solutions Page lviii

    String[] names ={ "Berlin", "Beethoven", "Bach", "Berlioz", "Gershwin",

    + )

    model_.addElement( names[i] );

    list.setModel( model_ );

    "Lennon", "McCartney", "Mozart", "Stravinsky" };

    for( int i = 0; i < names.length; i+

    // Apply model

    setDefaultCloseOperation( JFrame.DISPOSE_ON_CLOSE );// Use default closing mechanism to close frame

    setBounds( 200, 100, 300, 400 ); // Size frame

    FontSetter.setFont( this, new Font("SansSerif", Font.PLAIN, 20) );

    show();

    // Set font of entire frame just before showing.

    r// End of class

    g

    isplay purposes; it hasexercise.

    and

    ponent c, Font f ) {

    t(); i++)), f );

    t(); i++)nt.getComponent(i), f );

    c.setFont( f );}

    } // End of c'to}

    // FontSetter is a convenience class. Its one static// method, setFont(), is used to change the font settin// for all components in a container. This is simply// to make the font bigger for d// no bearing on the class FontSetter {

    // Change the font of the desired component// all its contained component

    om

    s and menus.

    public static void setFont( Cif( c instanceof JMenu ) {JMenu mnu = (JMenu) c;for(int i = 0; i < mnu.getMenuComponentCoun

    setFont( mnu.getMenuComponent(i}else if( c instanceof Container ) {

    Container cont = (Container) c;for(int i = 0; i < cont.getComponentCoun

    setFont( co}

    }