/*
Java Swing, 2nd Edition
By Marc Loy, Robert Eckstein, Dave Wood, James Elliott, Brian Cole
ISBN: 0-596-00408-7
Publisher: O'Reilly
*/
// OptPaneComparison.java
//A quick utility class to help you see the differences between various
//types of option panes, both via internal frames and using standalone
//popups.
//
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;
import javax.swing.JDesktopPane;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JInternalFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
public class OptPaneComparison extends JFrame {
protected JOptionPane optPane;
public static void main(String[] args) {
JFrame f = new OptPaneComparison("Enter your name");
f.setVisible(true);
}
public OptPaneComparison(final String message) {
setDefaultCloseOperation(EXIT_ON_CLOSE);
final int msgType = JOptionPane.QUESTION_MESSAGE;
final int optType = JOptionPane.OK_CANCEL_OPTION;
final String title = message;
setSize(350, 200);
// Create a desktop for internal frames
final JDesktopPane desk = new JDesktopPane();
setContentPane(desk);
// Add a simple menu bar
JMenuBar mb = new JMenuBar();
setJMenuBar(mb);
JMenu menu = new JMenu("Dialog");
JMenu imenu = new JMenu("Internal");
mb.add(menu);
mb.add(imenu);
final JMenuItem construct = new JMenuItem("Constructor");
final JMenuItem stat = new JMenuItem("Static Method");
final JMenuItem iconstruct = new JMenuItem("Constructor");
final JMenuItem istat = new JMenuItem("Static Method");
menu.add(construct);
menu.add(stat);
imenu.add(iconstruct);
imenu.add(istat);
// Create our JOptionPane. We're asking for input, so we call
// setWantsInput.
// Note that we cannot specify this via constructor parameters.
optPane = new JOptionPane(message, msgType, optType);
optPane.setWantsInput(true);
// Add a listener for each menu item that will display the appropriate
// dialog/internal frame
construct.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ev) {
// Create and display the dialog
JDialog d = optPane.createDialog(desk, title);
d.setVisible(true);
respond(getOptionPaneValue());
}
});
stat.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ev) {
String s = JOptionPane.showInputDialog(desk, message, title,
msgType);
respond(s);
}
});
iconstruct.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ev) {
// Create and display the dialog
JInternalFrame f = optPane.createInternalFrame(desk, title);
f.setVisible(true);
// Listen for the frame to close before getting the value from
// it.
f.addPropertyChangeListener(new PropertyChangeListener() {
public void propertyChange(PropertyChangeEvent ev) {
if ((ev.getPropertyName()
.equals(JInternalFrame.IS_CLOSED_PROPERTY))
&& (ev.getNewValue() == Boolean.TRUE)) {
respond(getOptionPaneValue());
}
}
});
}
});
istat.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ev) {
String s = JOptionPane.showInternalInputDialog(desk, message,
title, msgType);
respond(s);
}
});
}
// This method gets the selected value from the option pane and resets the
// value to null so we can use it again.
protected String getOptionPaneValue() {
// Get the result . . .
Object o = optPane.getInputValue();
String s = "";
if (o != null)
s = (String) o;
Object val = optPane.getValue(); // which button?
// Check for cancel button or closed option
if (val != null) {
if (val instanceof Integer) {
int intVal = ((Integer) val).intValue();
if ((intVal == JOptionPane.CANCEL_OPTION)
|| (intVal == JOptionPane.CLOSED_OPTION))
s = "";
}
}
// A little trick to clean the text field. It is only updated if
// the initial value gets changed. To do this, we'll set it to a
// dummy value ("X") and then clear it.
optPane.setValue("");
optPane.setInitialValue("X");
optPane.setInitialValue("");
return s;
}
protected void respond(String s) {
if (s == null)
System.out.println("Never mind.");
else
System.out.println("You entered: " + s);
}
}