BasicOptionPaneUIpublic class BasicOptionPaneUI extends OptionPaneUI Provides the basic look and feel for a JOptionPane .
BasicMessagePaneUI provides a means to place an icon,
message and buttons into a Container .
Generally, the layout will look like:
------------------
| i | message |
| c | message |
| o | message |
| n | message |
------------------
| buttons |
|________________|
icon is an instance of Icon that is wrapped inside a
JLabel . The message is an opaque object and is tested
for the following: if the message is a Component it is
added to the Container , if it is an Icon
it is wrapped inside a JLabel and added to the
Container otherwise it is wrapped inside a JLabel .
The above layout is used when the option pane's
ComponentOrientation property is horizontal, left-to-right.
The layout will be adjusted appropriately for other orientations.
The Container , message, icon, and buttons are all
determined from abstract methods. |
Fields Summary |
---|
public static final int | MinimumWidth | public static final int | MinimumHeight | private static String | newline | protected JOptionPane | optionPaneJOptionPane that the receiver is providing the
look and feel for. | protected Dimension | minimumSize | protected JComponent | inputComponentJComponent provide for input if optionPane.getWantsInput() returns
true. | protected Component | initialFocusComponentComponent to receive focus when messaged with selectInitialValue. | protected boolean | hasCustomComponentsThis is set to true in validateComponent if a Component is contained
in either the message or the buttons. | protected PropertyChangeListener | propertyChangeListener | private Handler | handler |
Methods Summary |
---|
protected void | addButtonComponents(java.awt.Container container, java.lang.Object[] buttons, int initialIndex)Creates the appropriate object to represent each of the objects in
buttons and adds it to container . This
differs from addMessageComponents in that it will recurse on
buttons and that if button is not a Component
it will create an instance of JButton.
if (buttons != null && buttons.length > 0) {
boolean sizeButtonsToSame = getSizeButtonsToSameWidth();
boolean createdAll = true;
int numButtons = buttons.length;
JButton[] createdButtons = null;
int maxWidth = 0;
if (sizeButtonsToSame) {
createdButtons = new JButton[numButtons];
}
for(int counter = 0; counter < numButtons; counter++) {
Object button = buttons[counter];
Component newComponent;
if (button instanceof Component) {
createdAll = false;
newComponent = (Component)button;
container.add(newComponent);
hasCustomComponents = true;
} else {
JButton aButton;
if (button instanceof ButtonFactory) {
aButton = ((ButtonFactory)button).createButton();
}
else if (button instanceof Icon)
aButton = new JButton((Icon)button);
else
aButton = new JButton(button.toString());
aButton.setName("OptionPane.button");
aButton.setMultiClickThreshhold(DefaultLookup.getInt(
optionPane, this, "OptionPane.buttonClickThreshhold",
0));
configureButton(aButton);
container.add(aButton);
ActionListener buttonListener = createButtonActionListener(counter);
if (buttonListener != null) {
aButton.addActionListener(buttonListener);
}
newComponent = aButton;
}
if (sizeButtonsToSame && createdAll &&
(newComponent instanceof JButton)) {
createdButtons[counter] = (JButton)newComponent;
maxWidth = Math.max(maxWidth,
newComponent.getMinimumSize().width);
}
if (counter == initialIndex) {
initialFocusComponent = newComponent;
if (initialFocusComponent instanceof JButton) {
JButton defaultB = (JButton)initialFocusComponent;
defaultB.addAncestorListener(new AncestorListener() {
public void ancestorAdded(AncestorEvent e) {
JButton defaultButton = (JButton)e.getComponent();
JRootPane root = SwingUtilities.getRootPane(defaultButton);
if (root != null) {
root.setDefaultButton(defaultButton);
}
}
public void ancestorRemoved(AncestorEvent event) {}
public void ancestorMoved(AncestorEvent event) {}
});
}
}
}
((ButtonAreaLayout)container.getLayout()).
setSyncAllWidths((sizeButtonsToSame && createdAll));
/* Set the padding, windows seems to use 8 if <= 2 components,
otherwise 4 is used. It may actually just be the size of the
buttons is always the same, not sure. */
if (DefaultLookup.getBoolean(optionPane, this,
"OptionPane.setButtonMargin", true) && sizeButtonsToSame &&
createdAll) {
JButton aButton;
int padSize;
padSize = (numButtons <= 2? 8 : 4);
for(int counter = 0; counter < numButtons; counter++) {
aButton = createdButtons[counter];
aButton.setMargin(new Insets(2, padSize, 2, padSize));
}
}
}
| protected void | addIcon(java.awt.Container top)Creates and adds a JLabel representing the icon returned from
getIcon to top . This is messaged from
createMessageArea
/* Create the icon. */
Icon sideIcon = getIcon();
if (sideIcon != null) {
JLabel iconLabel = new JLabel(sideIcon);
iconLabel.setName("OptionPane.iconLabel");
iconLabel.setVerticalAlignment(SwingConstants.TOP);
top.add(iconLabel, BorderLayout.BEFORE_LINE_BEGINS);
}
| protected void | addMessageComponents(java.awt.Container container, java.awt.GridBagConstraints cons, java.lang.Object msg, int maxll, boolean internallyCreated)Creates the appropriate object to represent msg and
places it into container . If msg is an
instance of Component, it is added directly, if it is an Icon,
a JLabel is created to represent it, otherwise a JLabel is
created for the string, if d is an Object[], this
method will be recursively invoked for the children.
internallyCreated is true if Objc is an instance
of Component and was created internally by this method (this is
used to correctly set hasCustomComponents only if !internallyCreated).
if (msg == null) {
return;
}
if (msg instanceof Component) {
// To workaround problem where Gridbad will set child
// to its minimum size if its preferred size will not fit
// within allocated cells
if (msg instanceof JScrollPane || msg instanceof JPanel) {
cons.fill = GridBagConstraints.BOTH;
cons.weighty = 1;
} else {
cons.fill = GridBagConstraints.HORIZONTAL;
}
cons.weightx = 1;
container.add((Component) msg, cons);
cons.weightx = 0;
cons.weighty = 0;
cons.fill = GridBagConstraints.NONE;
cons.gridy++;
if (!internallyCreated) {
hasCustomComponents = true;
}
} else if (msg instanceof Object[]) {
Object [] msgs = (Object[]) msg;
for (int i = 0; i < msgs.length; i++) {
addMessageComponents(container, cons, msgs[i], maxll, false);
}
} else if (msg instanceof Icon) {
JLabel label = new JLabel( (Icon)msg, SwingConstants.CENTER );
configureMessageLabel(label);
addMessageComponents(container, cons, label, maxll, true);
} else {
String s = msg.toString();
int len = s.length();
if (len <= 0) {
return;
}
int nl = -1;
int nll = 0;
if ((nl = s.indexOf(newline)) >= 0) {
nll = newline.length();
} else if ((nl = s.indexOf("\r\n")) >= 0) {
nll = 2;
} else if ((nl = s.indexOf('\n")) >= 0) {
nll = 1;
}
if (nl >= 0) {
// break up newlines
if (nl == 0) {
JPanel breakPanel = new JPanel() {
public Dimension getPreferredSize() {
Font f = getFont();
if (f != null) {
return new Dimension(1, f.getSize() + 2);
}
return new Dimension(0, 0);
}
};
breakPanel.setName("OptionPane.break");
addMessageComponents(container, cons, breakPanel, maxll,
true);
} else {
addMessageComponents(container, cons, s.substring(0, nl),
maxll, false);
}
addMessageComponents(container, cons, s.substring(nl + nll), maxll,
false);
} else if (len > maxll) {
Container c = Box.createVerticalBox();
c.setName("OptionPane.verticalBox");
burstStringInto(c, s, maxll);
addMessageComponents(container, cons, c, maxll, true );
} else {
JLabel label;
label = new JLabel( s, JLabel.LEADING );
label.setName("OptionPane.label");
configureMessageLabel(label);
addMessageComponents(container, cons, label, maxll, true);
}
}
| protected void | burstStringInto(java.awt.Container c, java.lang.String d, int maxll)Recursively creates new JLabel instances to represent d .
Each JLabel instance is added to c .
// Primitive line wrapping
int len = d.length();
if (len <= 0)
return;
if (len > maxll) {
int p = d.lastIndexOf(' ", maxll);
if (p <= 0)
p = d.indexOf(' ", maxll);
if (p > 0 && p < len) {
burstStringInto(c, d.substring(0, p), maxll);
burstStringInto(c, d.substring(p + 1), maxll);
return;
}
}
JLabel label = new JLabel(d, JLabel.LEFT);
label.setName("OptionPane.label");
configureMessageLabel(label);
c.add(label);
| private void | configureButton(javax.swing.JButton button)Configures any necessary colors/fonts for the specified button
used representing the button portion of the optionpane.
Font buttonFont = (Font)DefaultLookup.get(optionPane, this,
"OptionPane.buttonFont");
if (buttonFont != null) {
button.setFont(buttonFont);
}
| private void | configureMessageLabel(javax.swing.JLabel label)Configures any necessary colors/fonts for the specified label
used representing the message.
Color color = (Color)DefaultLookup.get(optionPane, this,
"OptionPane.messageForeground");
if (color != null) {
label.setForeground(color);
}
Font messageFont = (Font)DefaultLookup.get(optionPane, this,
"OptionPane.messageFont");
if (messageFont != null) {
label.setFont(messageFont);
}
| public boolean | containsCustomComponents(javax.swing.JOptionPane op)Returns true if in the last call to validateComponent the message
or buttons contained a subclass of Component.
return hasCustomComponents;
| protected java.awt.event.ActionListener | createButtonActionListener(int buttonIndex)
return new ButtonActionListener(buttonIndex);
| protected java.awt.Container | createButtonArea()Creates and returns a Container containing the buttons. The buttons
are created by calling getButtons .
JPanel bottom = new JPanel();
Border border = (Border)DefaultLookup.get(optionPane, this,
"OptionPane.buttonAreaBorder");
bottom.setName("OptionPane.buttonArea");
if (border != null) {
bottom.setBorder(border);
}
bottom.setLayout(new ButtonAreaLayout(
DefaultLookup.getBoolean(optionPane, this,
"OptionPane.sameSizeButtons", true),
DefaultLookup.getInt(optionPane, this, "OptionPane.buttonPadding",
6),
DefaultLookup.getInt(optionPane, this,
"OptionPane.buttonOrientation", SwingConstants.CENTER),
DefaultLookup.getBoolean(optionPane, this, "OptionPane.isYesLast",
false)));
addButtonComponents(bottom, getButtons(), getInitialValueIndex());
return bottom;
| protected java.awt.LayoutManager | createLayoutManager()
return new BoxLayout(optionPane, BoxLayout.Y_AXIS);
| protected java.awt.Container | createMessageArea()Messaged from installComponents to create a Container containing the
body of the message. The icon is the created by calling
addIcon .
JPanel top = new JPanel();
Border topBorder = (Border)DefaultLookup.get(optionPane, this,
"OptionPane.messageAreaBorder");
if (topBorder != null) {
top.setBorder(topBorder);
}
top.setLayout(new BorderLayout());
/* Fill the body. */
Container body = new JPanel(new GridBagLayout());
Container realBody = new JPanel(new BorderLayout());
body.setName("OptionPane.body");
realBody.setName("OptionPane.realBody");
if (getIcon() != null) {
JPanel sep = new JPanel();
sep.setName("OptionPane.separator");
sep.setPreferredSize(new Dimension(15, 1));
realBody.add(sep, BorderLayout.BEFORE_LINE_BEGINS);
}
realBody.add(body, BorderLayout.CENTER);
GridBagConstraints cons = new GridBagConstraints();
cons.gridx = cons.gridy = 0;
cons.gridwidth = GridBagConstraints.REMAINDER;
cons.gridheight = 1;
cons.anchor = DefaultLookup.getInt(optionPane, this,
"OptionPane.messageAnchor", GridBagConstraints.CENTER);
cons.insets = new Insets(0,0,3,0);
addMessageComponents(body, cons, getMessage(),
getMaxCharactersPerLineCount(), false);
top.add(realBody, BorderLayout.CENTER);
addIcon(top);
return top;
| protected java.beans.PropertyChangeListener | createPropertyChangeListener()
return getHandler();
| protected java.awt.Container | createSeparator()
return null;
| public static javax.swing.plaf.ComponentUI | createUI(javax.swing.JComponent x)Creates a new BasicOptionPaneUI instance.
return new BasicOptionPaneUI();
| protected java.lang.Object[] | getButtons()Returns the buttons to display from the JOptionPane the receiver is
providing the look and feel for. If the JOptionPane has options
set, they will be provided, otherwise if the optionType is
YES_NO_OPTION, yesNoOptions is returned, if the type is
YES_NO_CANCEL_OPTION yesNoCancelOptions is returned, otherwise
defaultButtons are returned.
if (optionPane != null) {
Object[] suppliedOptions = optionPane.getOptions();
if (suppliedOptions == null) {
Object[] defaultOptions;
int type = optionPane.getOptionType();
Locale l = optionPane.getLocale();
if (type == JOptionPane.YES_NO_OPTION) {
defaultOptions = new ButtonFactory[2];
defaultOptions[0] = new ButtonFactory(
UIManager.getString("OptionPane.yesButtonText", l),
getMnemonic("OptionPane.yesButtonMnemonic", l),
(Icon)DefaultLookup.get(optionPane, this,
"OptionPane.yesIcon"));
defaultOptions[1] = new ButtonFactory(
UIManager.getString("OptionPane.noButtonText", l),
getMnemonic("OptionPane.noButtonMnemonic", l),
(Icon)DefaultLookup.get(optionPane, this,
"OptionPane.noIcon"));
} else if (type == JOptionPane.YES_NO_CANCEL_OPTION) {
defaultOptions = new ButtonFactory[3];
defaultOptions[0] = new ButtonFactory(
UIManager.getString("OptionPane.yesButtonText", l),
getMnemonic("OptionPane.yesButtonMnemonic", l),
(Icon)DefaultLookup.get(optionPane, this,
"OptionPane.yesIcon"));
defaultOptions[1] = new ButtonFactory(
UIManager.getString("OptionPane.noButtonText",l),
getMnemonic("OptionPane.noButtonMnemonic", l),
(Icon)DefaultLookup.get(optionPane, this,
"OptionPane.noIcon"));
defaultOptions[2] = new ButtonFactory(
UIManager.getString("OptionPane.cancelButtonText",l),
getMnemonic("OptionPane.cancelButtonMnemonic", l),
(Icon)DefaultLookup.get(optionPane, this,
"OptionPane.cancelIcon"));
} else if (type == JOptionPane.OK_CANCEL_OPTION) {
defaultOptions = new ButtonFactory[2];
defaultOptions[0] = new ButtonFactory(
UIManager.getString("OptionPane.okButtonText",l),
getMnemonic("OptionPane.okButtonMnemonic", l),
(Icon)DefaultLookup.get(optionPane, this,
"OptionPane.okIcon"));
defaultOptions[1] = new ButtonFactory(
UIManager.getString("OptionPane.cancelButtonText",l),
getMnemonic("OptionPane.cancelButtonMnemonic", l),
(Icon)DefaultLookup.get(optionPane, this,
"OptionPane.cancelIcon"));
} else {
defaultOptions = new ButtonFactory[1];
defaultOptions[0] = new ButtonFactory(
UIManager.getString("OptionPane.okButtonText",l),
getMnemonic("OptionPane.okButtonMnemonic", l),
(Icon)DefaultLookup.get(optionPane, this,
"OptionPane.okIcon"));
}
return defaultOptions;
}
return suppliedOptions;
}
return null;
| private javax.swing.plaf.basic.BasicOptionPaneUI$Handler | getHandler()
if (handler == null) {
handler = new Handler();
}
return handler;
| protected javax.swing.Icon | getIcon()Returns the icon from the JOptionPane the receiver is providing
the look and feel for, or the default icon as returned from
getDefaultIcon .
Icon mIcon = (optionPane == null ? null : optionPane.getIcon());
if(mIcon == null && optionPane != null)
mIcon = getIconForType(optionPane.getMessageType());
return mIcon;
| protected javax.swing.Icon | getIconForType(int messageType)Returns the icon to use for the passed in type.
if(messageType < 0 || messageType > 3)
return null;
String propertyName = null;
switch(messageType) {
case 0:
propertyName = "OptionPane.errorIcon";
break;
case 1:
propertyName = "OptionPane.informationIcon";
break;
case 2:
propertyName = "OptionPane.warningIcon";
break;
case 3:
propertyName = "OptionPane.questionIcon";
break;
}
if (propertyName != null) {
return (Icon)DefaultLookup.get(optionPane, this, propertyName);
}
return null;
| protected int | getInitialValueIndex()Returns the initial index into the buttons to select. The index
is calculated from the initial value from the JOptionPane and
options of the JOptionPane or 0.
if (optionPane != null) {
Object iv = optionPane.getInitialValue();
Object[] options = optionPane.getOptions();
if(options == null) {
return 0;
}
else if(iv != null) {
for(int counter = options.length - 1; counter >= 0; counter--){
if(options[counter].equals(iv))
return counter;
}
}
}
return -1;
| javax.swing.InputMap | getInputMap(int condition)
if (condition == JComponent.WHEN_IN_FOCUSED_WINDOW) {
Object[] bindings = (Object[])DefaultLookup.get(
optionPane, this, "OptionPane.windowBindings");
if (bindings != null) {
return LookAndFeel.makeComponentInputMap(optionPane, bindings);
}
}
return null;
| protected int | getMaxCharactersPerLineCount()Returns the maximum number of characters to place on a line.
return optionPane.getMaxCharactersPerLineCount();
| protected java.lang.Object | getMessage()Returns the message to display from the JOptionPane the receiver is
providing the look and feel for.
inputComponent = null;
if (optionPane != null) {
if (optionPane.getWantsInput()) {
/* Create a user component to capture the input. If the
selectionValues are non null the component and there
are < 20 values it'll be a combobox, if non null and
>= 20, it'll be a list, otherwise it'll be a textfield. */
Object message = optionPane.getMessage();
Object[] sValues = optionPane.getSelectionValues();
Object inputValue = optionPane
.getInitialSelectionValue();
JComponent toAdd;
if (sValues != null) {
if (sValues.length < 20) {
JComboBox cBox = new JComboBox();
cBox.setName("OptionPane.comboBox");
for(int counter = 0, maxCounter = sValues.length;
counter < maxCounter; counter++) {
cBox.addItem(sValues[counter]);
}
if (inputValue != null) {
cBox.setSelectedItem(inputValue);
}
inputComponent = cBox;
toAdd = cBox;
} else {
JList list = new JList(sValues);
JScrollPane sp = new JScrollPane(list);
sp.setName("OptionPane.scrollPane");
list.setName("OptionPane.list");
list.setVisibleRowCount(10);
list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
if(inputValue != null)
list.setSelectedValue(inputValue, true);
list.addMouseListener(getHandler());
toAdd = sp;
inputComponent = list;
}
} else {
MultiplexingTextField tf = new MultiplexingTextField(20);
tf.setName("OptionPane.textField");
tf.setKeyStrokes(new KeyStroke[] {
KeyStroke.getKeyStroke("ENTER") } );
if (inputValue != null) {
String inputString = inputValue.toString();
tf.setText(inputString);
tf.setSelectionStart(0);
tf.setSelectionEnd(inputString.length());
}
tf.addActionListener(getHandler());
toAdd = inputComponent = tf;
}
Object[] newMessage;
if (message == null) {
newMessage = new Object[1];
newMessage[0] = toAdd;
} else {
newMessage = new Object[2];
newMessage[0] = message;
newMessage[1] = toAdd;
}
return newMessage;
}
return optionPane.getMessage();
}
return null;
| public java.awt.Dimension | getMinimumOptionPaneSize()Returns the minimum size the option pane should be. Primarily
provided for subclassers wishing to offer a different minimum size.
if (minimumSize == null) {
return new Dimension(MinimumWidth, MinimumHeight);
}
return new Dimension(minimumSize.width,
minimumSize.height);
| private int | getMnemonic(java.lang.String key, java.util.Locale l)
String value = (String)UIManager.get(key, l);
if (value == null) {
return 0;
}
try {
return Integer.parseInt(value);
}
catch (NumberFormatException nfe) { }
return 0;
| public java.awt.Dimension | getPreferredSize(javax.swing.JComponent c)If c is the JOptionPane the receiver
is contained in, the preferred
size that is returned is the maximum of the preferred size of
the LayoutManager for the JOptionPane , and
getMinimumOptionPaneSize .
if ((JOptionPane)c == optionPane) {
Dimension ourMin = getMinimumOptionPaneSize();
LayoutManager lm = c.getLayout();
if (lm != null) {
Dimension lmSize = lm.preferredLayoutSize(c);
if (ourMin != null)
return new Dimension
(Math.max(lmSize.width, ourMin.width),
Math.max(lmSize.height, ourMin.height));
return lmSize;
}
return ourMin;
}
return null;
| protected boolean | getSizeButtonsToSameWidth()Returns true, basic L&F wants all the buttons to have the same
width.
return true;
| protected void | installComponents()
optionPane.add(createMessageArea());
Container separator = createSeparator();
if (separator != null) {
optionPane.add(separator);
}
optionPane.add(createButtonArea());
optionPane.applyComponentOrientation(optionPane.getComponentOrientation());
| protected void | installDefaults()
LookAndFeel.installColorsAndFont(optionPane, "OptionPane.background",
"OptionPane.foreground", "OptionPane.font");
LookAndFeel.installBorder(optionPane, "OptionPane.border");
minimumSize = UIManager.getDimension("OptionPane.minimumSize");
LookAndFeel.installProperty(optionPane, "opaque", Boolean.TRUE);
| protected void | installKeyboardActions()
InputMap map = getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
SwingUtilities.replaceUIInputMap(optionPane, JComponent.
WHEN_IN_FOCUSED_WINDOW, map);
LazyActionMap.installLazyActionMap(optionPane, BasicOptionPaneUI.class,
"OptionPane.actionMap");
| protected void | installListeners()
if ((propertyChangeListener = createPropertyChangeListener()) != null) {
optionPane.addPropertyChangeListener(propertyChangeListener);
}
| public void | installUI(javax.swing.JComponent c)Installs the receiver as the L&F for the passed in
JOptionPane .
optionPane = (JOptionPane)c;
installDefaults();
optionPane.setLayout(createLayoutManager());
installComponents();
installListeners();
installKeyboardActions();
| static void | loadActionMap(javax.swing.plaf.basic.LazyActionMap map)
newline = (String)java.security.AccessController.doPrivileged(
new GetPropertyAction("line.separator"));
if (newline == null) {
newline = "\n";
}
map.put(new Actions(Actions.CLOSE));
BasicLookAndFeel.installAudioActionMap(map);
| protected void | resetInputValue()Sets the input value in the option pane the receiver is providing
the look and feel for based on the value in the inputComponent.
if(inputComponent != null && (inputComponent instanceof JTextField)) {
optionPane.setInputValue(((JTextField)inputComponent).getText());
} else if(inputComponent != null &&
(inputComponent instanceof JComboBox)) {
optionPane.setInputValue(((JComboBox)inputComponent)
.getSelectedItem());
} else if(inputComponent != null) {
optionPane.setInputValue(((JList)inputComponent)
.getSelectedValue());
}
| public void | selectInitialValue(javax.swing.JOptionPane op)If inputComponent is non-null, the focus is requested on that,
otherwise request focus on the default value
if (inputComponent != null)
inputComponent.requestFocus();
else {
if (initialFocusComponent != null)
initialFocusComponent.requestFocus();
if (initialFocusComponent instanceof JButton) {
JRootPane root = SwingUtilities.getRootPane(initialFocusComponent);
if (root != null) {
root.setDefaultButton((JButton)initialFocusComponent);
}
}
}
| protected void | uninstallComponents()
hasCustomComponents = false;
inputComponent = null;
initialFocusComponent = null;
optionPane.removeAll();
| protected void | uninstallDefaults()
LookAndFeel.uninstallBorder(optionPane);
| protected void | uninstallKeyboardActions()
SwingUtilities.replaceUIInputMap(optionPane, JComponent.
WHEN_IN_FOCUSED_WINDOW, null);
SwingUtilities.replaceUIActionMap(optionPane, null);
| protected void | uninstallListeners()
if (propertyChangeListener != null) {
optionPane.removePropertyChangeListener(propertyChangeListener);
propertyChangeListener = null;
}
handler = null;
| public void | uninstallUI(javax.swing.JComponent c)Removes the receiver from the L&F controller of the passed in split
pane.
uninstallComponents();
optionPane.setLayout(null);
uninstallKeyboardActions();
uninstallListeners();
uninstallDefaults();
optionPane = null;
|
|