java swing v2.1 workshop solutions
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}
}