/* AbstractButton.java -- Provides basic button functionality. Copyright (C) 2002, 2004 Free Software Foundation, Inc. This file is part of GNU Classpath. GNU Classpath is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. GNU Classpath is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with GNU Classpath; see the file COPYING. If not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. Linking this library statically or dynamically with other modules is making a combined work based on this library. Thus, the terms and conditions of the GNU General Public License cover the whole combination. As a special exception, the copyright holders of this library give you permission to link this library with independent modules to produce an executable, regardless of the license terms of these independent modules, and to copy and distribute the resulting executable under terms of your choice, provided that you also meet, for each linked independent module, the terms and conditions of the license of that module. An independent module is a module which is not derived from or based on this library. If you modify this library, you may extend this exception to your version of the library, but you are not obligated to do so. If you do not wish to do so, delete this exception statement from your version. */ package javax.swing; import java.awt.AWTEvent; import java.awt.AWTEventMulticaster; import java.awt.Graphics; import java.awt.Image; import java.awt.Insets; import java.awt.ItemSelectable; import java.awt.Point; import java.awt.Rectangle; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.FocusEvent; import java.awt.event.FocusListener; import java.awt.event.ItemEvent; import java.awt.event.ItemListener; import java.awt.event.MouseEvent; import java.beans.PropertyChangeEvent; import java.beans.PropertyChangeListener; import java.io.Serializable; import java.util.Vector; import java.util.EventListener; import javax.accessibility.AccessibleAction; import javax.accessibility.AccessibleIcon; import javax.accessibility.AccessibleRelationSet; import javax.accessibility.AccessibleStateSet; import javax.accessibility.AccessibleText; import javax.accessibility.AccessibleValue; import javax.swing.event.ChangeEvent; import javax.swing.event.ChangeListener; import javax.swing.plaf.ButtonUI; import javax.swing.text.AttributeSet; /** *
The purpose of this class is to serve as a facade over a number of * classes which collectively represent the semantics of a button: the * button's model, its listeners, its action, and its look and feel. Some * parts of a button's state are stored explicitly in this class, other * parts are delegates to the model. Some methods related to buttons are * implemented in this class, other methods pass through to the current * model or look and feel.
* *Furthermore this class is supposed to serve as a base class for * several kinds of buttons with similar but non-identical semantics: * toggle buttons (radio buttons and checkboxes), simple "push" buttons, * menu items.
* *Buttons have many properties, some of which are stored in this class * while others are delegated to the button's model. The following properties * are available:
* *Property | Stored in | Bound? |
---|---|---|
action | button | no |
actionCommand | model | no |
borderPainted | button | yes |
contentAreaFilled | button | yes |
disabledIcon | button | yes |
disabledSelectedIcon | button | yes |
displayedMnemonicIndex | button | no |
enabled | model | no |
focusPainted | button | yes |
horizontalAlignment | button | yes |
horizontalTextPosition | button | yes |
icon | button | yes |
iconTextGap | button | no |
label (same as text) | model | yes |
margin | button | yes |
multiClickThreshold | button | no |
pressedIcon | button | yes |
rolloverEnabled | button | yes |
rolloverIcon | button | yes |
rolloverSelectedIcon | button | yes |
selected | model | no |
selectedIcon | button | yes |
selectedObjects | button | no |
text | model | yes |
UI | button | yes |
verticalAlignment | button | yes |
verticalTextPosition | button | yes |
The various behavioral aspects of these properties follows:
* *true
, the model will fire an ActionEvent to its
* ActionListeners, which include the button. The button will propagate
* this ActionEvent to its ActionListeners, with the ActionEvent's "source"
* property set to refer to the button, rather than the model.index
is not within the
* range of legal offsets for the "text" property of the button.
* @since 1.4
*/
public void setDisplayedMnemonicIndex(int index)
{
if (index < -1 || index >= text.length())
throw new IllegalArgumentException();
else
mnemonicIndex = index;
}
/**
* Get the button's mnemonic index, which is an offset into the button's
* "text" property. The character specified by this offset should be
* underlined when the look and feel class draws this button.
*
* @return An index into the button's "text" property
*/
public int getDisplayedMnemonicIndex(int index)
{
return mnemonicIndex;
}
/**
* Set the "rolloverEnabled" property. When rollover is enabled, and the
* look and feel supports it, the button will change its icon to
* rollover_icon, when the mouse passes over it.
*
* @param r Whether or not to enable rollover icon changes
*/
public void setRolloverEnabled(boolean r)
{
boolean old = getModel().isRollover();
getModel().setRollover(r);
if (old != getModel().isRollover())
{
firePropertyChange(ROLLOVER_ENABLED_CHANGED_PROPERTY, old, r);
revalidate();
repaint();
}
}
/**
* Returns whether or not rollover icon changes are enabled on the
* button.
*
* @return The state of the "rolloverEnabled" property
*/
public boolean isRolloverEnabled()
{
return getModel().isRollover();
}
/**
* Set the value of the button's "selected" property. Selection is only
* meaningful for toggle-type buttons (check boxes, radio buttons).
*
* @param s New value for the property
*/
public void setSelected(boolean s)
{
getModel().setSelected(s);
}
/**
* Get the value of the button's "selected" property. Selection is only
* meaningful for toggle-type buttons (check boxes, radio buttons).
*
* @return The value of the property
*/
public boolean isSelected()
{
return getModel().isSelected();
}
/**
* Enables or disables the button. A button will neither be selectable
* nor preform any actions unless it is enabled.
*
* @param b Whether or not to enable the button
*/
public void setEnabled(boolean b)
{
super.setEnabled(b);
getModel().setEnabled(b);
}
/**
* Set the horizontal alignment of the button's text and icon. The
* alignment is a numeric constant from {@link SwingConstants}. It must
* be one of: RIGHT
, LEFT
, CENTER
,
* LEADING
or TRAILING
. The default is
* RIGHT
.
*
* @return The current horizontal alignment
*/
public int getHorizontalAlignment()
{
return hori_align;
}
/**
* Set the horizontal alignment of the button's text and icon. The
* alignment is a numeric constant from {@link SwingConstants}. It must
* be one of: RIGHT
, LEFT
, CENTER
,
* LEADING
or TRAILING
. The default is
* RIGHT
.
*
* @param a The new horizontal alignment
* @throws IllegalArgumentException If alignment is not one of the legal
* constants.
*/
public void setHorizontalAlignment(int a)
{
int old = hori_align;
hori_align = a;
if (old != a)
{
firePropertyChange(HORIZONTAL_ALIGNMENT_CHANGED_PROPERTY, old, a);
revalidate();
repaint();
}
}
/**
* Get the horizontal position of the button's text relative to its
* icon. The position is a numeric constant from {@link
* SwingConstants}. It must be one of: RIGHT
,
* LEFT
, CENTER
, LEADING
or
* TRAILING
. The default is TRAILING
.
*
* @return The current horizontal text position
*/
public int getHorizontalTextPosition()
{
return hori_text_pos;
}
/**
* Set the horizontal position of the button's text relative to its
* icon. The position is a numeric constant from {@link
* SwingConstants}. It must be one of: RIGHT
,
* LEFT
, CENTER
, LEADING
or
* TRAILING
. The default is TRAILING
.
*
* @param t The new horizontal text position
* @throws IllegalArgumentException If position is not one of the legal
* constants.
*/
public void setHorizontalTextPosition(int t)
{
int old = hori_text_pos;
hori_text_pos = t;
if (old != t)
{
firePropertyChange(HORIZONTAL_TEXT_POSITION_CHANGED_PROPERTY, old, t);
revalidate();
repaint();
}
}
/**
* Get the vertical alignment of the button's text and icon. The
* alignment is a numeric constant from {@link SwingConstants}. It must
* be one of: CENTER
, TOP
, or
* BOTTOM
. The default is CENTER
.
*
* @return The current vertical alignment
*/
public int getVerticalAlignment()
{
return vert_align;
}
/**
* Set the vertical alignment of the button's text and icon. The
* alignment is a numeric constant from {@link SwingConstants}. It must
* be one of: CENTER
, TOP
, or
* BOTTOM
. The default is CENTER
.
*
* @param a The new vertical alignment
* @throws IllegalArgumentException If alignment is not one of the legal
* constants.
*/
public void setVerticalAlignment(int a)
{
int old = vert_align;
vert_align = a;
if (old != a)
{
firePropertyChange(VERTICAL_ALIGNMENT_CHANGED_PROPERTY, old, a);
revalidate();
repaint();
}
}
/**
* Get the vertical position of the button's text relative to its
* icon. The alignment is a numeric constant from {@link
* SwingConstants}. It must be one of: CENTER
,
* TOP
, or BOTTOM
. The default is
* CENTER
.
*
* @return The current vertical position
*/
public int getVerticalTextPosition()
{
return vert_text_pos;
}
/**
* Set the vertical position of the button's text relative to its
* icon. The alignment is a numeric constant from {@link
* SwingConstants}. It must be one of: CENTER
,
* TOP
, or BOTTOM
. The default is
* CENTER
.
*
* @param t The new vertical position
* @throws IllegalArgumentException If position is not one of the legal
* constants.
*/
public void setVerticalTextPosition(int t)
{
int old = vert_text_pos;
vert_text_pos = t;
if (old != t)
{
firePropertyChange(VERTICAL_TEXT_POSITION_CHANGED_PROPERTY, old, t);
revalidate();
repaint();
}
}
/**
* Set the value of the "borderPainted" property. If set to
* false
, the button's look and feel class should not paint
* a border for the button. The default is true
.
*
* @return The current value of the property.
*/
public boolean isBorderPainted()
{
return paint_border;
}
/**
* Set the value of the "borderPainted" property. If set to
* false
, the button's look and feel class should not paint
* a border for the button. The default is true
.
*
* @param b The new value of the property.
*/
public void setBorderPainted(boolean b)
{
boolean old = paint_border;
paint_border = b;
if (b != old)
{
firePropertyChange(BORDER_PAINTED_CHANGED_PROPERTY, old, b);
revalidate();
repaint();
}
}
/**
* Get the value of the "action" property.
*
* @return The current value of the "action" property
*/
public Action getAction()
{
return action;
}
/**
* Set the button's "action" property, subscribing the new action to the * button, as an ActionListener, if it is not already subscribed. The old * Action, if it exists, is unsubscribed, and the button is unsubscribed * from the old Action if it was previously subscribed as a * PropertyChangeListener.
* *This method also configures several of the button's properties from * the Action, by calling {@link configurePropertiesFromAction}, and * subscribes the button to the Action as a PropertyChangeListener. * Subsequent changes to the Action will thus reconfigure the button * automatically.
* * @param a The new value of the "action" property */ public void setAction(Action a) { if (action != null) { action.removePropertyChangeListener(actionPropertyChangeListener); removeActionListener(action); if (actionPropertyChangeListener != null) { action.removePropertyChangeListener(actionPropertyChangeListener); actionPropertyChangeListener = null; } actionPropertyChangeListener = createActionPropertyChangeListener(a); } Action old = action; action = a; configurePropertiesFromAction(action); if (action != null) { action.addPropertyChangeListener(actionPropertyChangeListener); addActionListener(action); } } /** * Return the button's default "icon" property. * * @return The current default icon */ public Icon getIcon() { return default_icon; } /** * Set the button's default "icon" property. This icon is used as a basis * for the pressed and disabled icons, if none are explicitly set. * * @param i The new default icon */ public void setIcon(Icon i) { Icon old = default_icon; default_icon = i; if (old != i) { firePropertyChange(ICON_CHANGED_PROPERTY, old, i); revalidate(); repaint(); } } /** * Return the button's "text" property. This property is synonymous with * the "label" property. * * @return The current "text" property */ public String getText() { return text; } /** * Set the button's "label" property. This property is synonymous with the * "text" property. * * @param label The new "label" property */ public void setLabel(String label) { setText(label); } /** * Return the button's "label" property. This property is synonymous with * the "text" property. * * @return The current "label" property */ public String getLabel() { return getText(); } /** * Set the button's "text" property. This property is synonymous with the * "label" property. * * @param t The new "text" property */ public void setText(String t) { String old = text; text = t; if (t != old) { firePropertyChange(TEXT_CHANGED_PROPERTY, old, t); revalidate(); repaint(); } } /** * Return the button's "margin" property, which is an {@link Insets} object * describing the distance between the button's border and its text and * icon. * * @return The current "margin" property */ public Insets getMargin() { return margin; } /** * Set the button's "margin" property, which is an {@link Insets} object * describing the distance between the button's border and its text and * icon. * * @param m The new "margin" property */ public void setMargin(Insets m) { Insets old = margin; margin = m; if (m != old) { firePropertyChange(MARGIN_CHANGED_PROPERTY, old, m); revalidate(); repaint(); } } /** * Return the button's "pressedIcon" property. The look and feel class * should paint this icon when the "pressed" property of the button's * {@link ButtonModel} istrue
. This property may be
* null
, in which case the default icon is used.
*
* @return The current "pressedIcon" property
*/
public Icon getPressedIcon()
{
return pressed_icon;
}
/**
* Set the button's "pressedIcon" property. The look and feel class
* should paint this icon when the "pressed" property of the button's
* {@link ButtonModel} is true
. This property may be
* null
, in which case the default icon is used.
*
* @param pressedIcon The new "pressedIcon" property
*/
public void setPressedIcon(Icon pressedIcon)
{
Icon old = pressed_icon;
pressed_icon = pressedIcon;
if (pressed_icon != old)
{
firePropertyChange(PRESSED_ICON_CHANGED_PROPERTY, old, pressed_icon);
revalidate();
repaint();
}
}
/**
* Return the button's "disabledIcon" property. The look and feel class
* should paint this icon when the "enabled" property of the button's
* {@link ButtonModel} is false
. This property may be
* null
, in which case an icon is constructed, based on the
* default icon.
*
* @return The current "disabledIcon" property
*/
public Icon getDisabledIcon()
{
return disabled_icon;
}
/**
* Set the button's "disabledIcon" property. The look and feel class should
* paint this icon when the "enabled" property of the button's {@link
* ButtonModel} is false
. This property may be
* null
, in which case an icon is constructed, based on the
* default icon.
*
* @param disabledIcon The new "disabledIcon" property
*/
public void setDisabledIcon(Icon disabledIcon)
{
disabled_icon = disabledIcon;
revalidate();
repaint();
}
/**
* Return the button's "paintFocus" property. This property controls
* whether or not the look and feel class will paint a special indicator
* of focus state for the button. If it is false, the button still paints
* when focused, but no special decoration is painted to indicate the
* presence of focus.
*
* @return The current "paintFocus" property
*/
public boolean isFocusPainted()
{
return paint_focus;
}
/**
* Set the button's "paintFocus" property. This property controls whether
* or not the look and feel class will paint a special indicator of focus
* state for the button. If it is false, the button still paints when
* focused, but no special decoration is painted to indicate the presence
* of focus.
*
* @param b The new "paintFocus" property
*/
public void setFocusPainted(boolean b)
{
boolean old = paint_focus;
paint_focus = b;
if (old != b)
{
firePropertyChange(FOCUS_PAINTED_CHANGED_PROPERTY, old, b);
revalidate();
repaint();
}
}
/**
* Return the button's "focusTraversable" property. This property controls
* whether or not the button can receive focus when the user attempts to
* traverse the focus hierarchy.
*
* @return The current "focusTraversable" property
*/
public boolean isFocusTraversable()
{
return true;
}
/**
* Verifies that a particular key is one of the valid constants used for
* describing horizontal alignment and positioning. The valid constants
* are the following members of {@link SwingConstants}:
* RIGHT
, LEFT
, CENTER
,
* LEADING
or TRAILING
.
*
* @param key The key to check
* @param exception A message to include in an IllegalArgumentException
*
* @return the value of key
*
* @throws IllegalArgumentException If key is not one of the valid constants
*
* @see setHorizontalTextPosition()
* @see setHorizontalAlignment()
*/
protected int checkHorizontalKey(int key, String exception)
{
switch (key)
{
case SwingConstants.RIGHT:
case SwingConstants.LEFT:
case SwingConstants.CENTER:
case SwingConstants.LEADING:
case SwingConstants.TRAILING:
break;
default:
throw new IllegalArgumentException(exception);
}
return key;
}
/**
* Verifies that a particular key is one of the valid constants used for
* describing vertical alignment and positioning. The valid constants are
* the following members of {@link SwingConstants}: TOP
,
* BOTTOM
or CENTER
.
*
* @param key The key to check
* @param exception A message to include in an IllegalArgumentException
*
* @return the value of key
*
* @throws IllegalArgumentException If key is not one of the valid constants
*
* @see setVerticalTextPosition()
* @see setVerticalAlignment()
*/
protected int checkVerticalKey(int key, String exception)
{
switch (key)
{
case SwingConstants.TOP:
case SwingConstants.BOTTOM:
case SwingConstants.CENTER:
break;
default:
throw new IllegalArgumentException(exception);
}
return key;
}
/**
* Configure various properties of the button by reading properties
* of an {@link Action}. The mapping of properties is as follows:
*
* Action keyed property | AbstractButton property |
---|---|
NAME | text |
SMALL_ICON | icon |
SHORT_DESCRIPTION | toolTipText |
MNEMONIC_KEY | mnemonic |
ACTION_COMMAND_KEY | actionCommand |
In addition, this method always sets the button's "enabled" property to * the value of the Action's "enabled" property.
* *If the provided Action is null
, the text, icon, and
* toolTipText properties of the button are set to null
, and
* the "enabled" property is set to true
; the mnemonic and
* actionCommand properties are unchanged.
A factory method which should return an {@link ActionListener} that * propagates events from the button's {@link ButtonModel} to any of the * button's ActionListeners. By default, this is an inner class which * calls {@link AbstractButton.fireActionPerformed} with a modified copy * of the incoming model {@link ActionEvent}.
* *The button calls this method during construction, stores the
* resulting ActionListener in its actionListener
member
* field, and subscribes it to the button's model. If the button's model
* is changed, this listener is unsubscribed from the old model and
* subscribed to the new one.
A factory method which should return a {@link PropertyChangeListener} * that accepts changes to the specified {@link Action} and reconfigure * the {@link AbstractButton}, by default using the {@link * configurePropertiesFromAction} method.
* *The button calls this method whenever a new Action is assigned to
* the button's "action" property, via {@link setAction}, and stores the
* resulting PropertyChangeListener in its
* actionPropertyChangeListener
member field. The button
* then subscribes the listener to the button's new action. If the
* button's action is changed subsequently, the listener is unsubscribed
* from the old action and subscribed to the new one.
Factory method which creates a {@link ChangeListener}, used to * subscribe to ChangeEvents from the button's model. Subclasses of * AbstractButton may wish to override the listener used to subscribe to * such ChangeEvents. By default, the listener just propagates the * {@link ChangeEvent} to the button's ChangeListeners, via the {@link * AbstractButton.fireStateChanged} method.
* *The button calls this method during construction, stores the
* resulting ChangeListener in its changeListener
member
* field, and subscribes it to the button's model. If the button's model
* is changed, this listener is unsubscribed from the old model and
* subscribed to the new one.
Factory method which creates a {@link ItemListener}, used to * subscribe to ItemEvents from the button's model. Subclasses of * AbstractButton may wish to override the listener used to subscribe to * such ItemEvents. By default, the listener just propagates the * {@link ItemEvent} to the button's ItemListeners, via the {@link * AbstractButton.fireItemStateChanged} method.
* *The button calls this method during construction, stores the
* resulting ItemListener in its changeListener
member
* field, and subscribes it to the button's model. If the button's model
* is changed, this listener is unsubscribed from the old model and
* subscribed to the new one.
Note that ItemEvents are only generated from the button's model
* when the model's selected property changes. If you want to
* subscribe to other properties of the model, you must subscribe to
* ChangeEvents.
*
* @return The new ItemListener
*/
protected ItemListener createItemListener()
{
return new ItemListener()
{
public void itemStateChanged(ItemEvent e)
{
AbstractButton.this.fireItemStateChanged(e);
}
};
}
/**
* Programmatically perform a "click" on the button: arming, pressing,
* waiting, un-pressing, and disarming the model.
*/
public void doClick()
{
doClick(100);
}
/**
* Programmatically perform a "click" on the button: arming, pressing,
* waiting, un-pressing, and disarming the model.
*
* @param pressTime The number of milliseconds to wait in the pressed state
*/
public void doClick(int pressTime)
{
getModel().setArmed(true);
getModel().setPressed(true);
try
{
java.lang.Thread.sleep(pressTime);
}
catch (java.lang.InterruptedException e)
{
// probably harmless
}
getModel().setPressed(false);
getModel().setArmed(false);
}
/**
* Return the button's disabled selected icon. The look and feel class
* should paint this icon when the "enabled" property of the button's model
* is false
and its "selected" property is
* true
. This icon can be null
, in which case
* it is synthesized from the button's selected icon.
*
* @return The current disabled selected icon
*/
public Icon getDisabledSelectedIcon()
{
return disabled_selected_icon;
}
/**
* Set the button's disabled selected icon. The look and feel class
* should paint this icon when the "enabled" property of the button's model
* is false
and its "selected" property is
* true
. This icon can be null
, in which case
* it is synthesized from the button's selected icon.
*
* @param disabledSelectedIcon The new disabled selected icon
*/
public void setDisabledSelectedIcon(Icon disabledSelectedIcon)
{
Icon old = disabled_selected_icon;
disabled_selected_icon = disabledSelectedIcon;
if (old != disabledSelectedIcon)
{
firePropertyChange(DISABLED_SELECTED_ICON_CHANGED_PROPERTY, old,
disabledSelectedIcon);
revalidate();
repaint();
}
}
/**
* Return the button's rollover icon. The look and feel class should
* paint this icon when the "rolloverEnabled" property of the button is
* true
and the mouse rolls over the button.
*
* @return The current rollover icon
*/
public Icon getRolloverIcon()
{
return rollover_icon;
}
/**
* Set the button's rollover icon. The look and feel class should
* paint this icon when the "rolloverEnabled" property of the button is
* true
and the mouse rolls over the button.
*
* @param rolloverIcon The new rollover icon
*/
public void setRolloverIcon(Icon rolloverIcon)
{
Icon old = rollover_icon;
rollover_icon = rolloverIcon;
if (old != rolloverIcon)
{
firePropertyChange(ROLLOVER_ICON_CHANGED_PROPERTY, old,
rolloverIcon);
revalidate();
repaint();
}
}
/**
* Return the button's rollover selected icon. The look and feel class
* should paint this icon when the "rolloverEnabled" property of the button
* is true
, the "selected" property of the button's model is
* true
, and the mouse rolls over the button.
*
* @return The current rollover selected icon
*/
public Icon getRolloverSelectedIcon()
{
return rollover_selected_icon;
}
/**
* Set the button's rollover selected icon. The look and feel class
* should paint this icon when the "rolloverEnabled" property of the button
* is true
, the "selected" property of the button's model is
* true
, and the mouse rolls over the button.
*
* @param rolloverSelectedIcon The new rollover selected icon
*/
public void setRolloverSelectedIcon(Icon rolloverSelectedIcon)
{
Icon old = rollover_selected_icon;
rollover_selected_icon = rolloverSelectedIcon;
if (old != rolloverSelectedIcon)
{
firePropertyChange(ROLLOVER_SELECTED_ICON_CHANGED_PROPERTY, old,
rolloverSelectedIcon);
revalidate();
repaint();
}
}
/**
* Return the button's selected icon. The look and feel class should
* paint this icon when the "selected" property of the button's model is
* true
, and either the "rolloverEnabled" property of the
* button is false
or the mouse is not currently rolled
* over the button.
*
* @return The current selected icon
*/
public Icon getSelectedIcon()
{
return selected_icon;
}
/**
* Set the button's selected icon. The look and feel class should
* paint this icon when the "selected" property of the button's model is
* true
, and either the "rolloverEnabled" property of the
* button is false
or the mouse is not currently rolled
* over the button.
*
* @param selectedIcon The new selected icon
*/
public void setSelectedIcon(Icon selectedIcon)
{
Icon old = selected_icon;
selected_icon = selectedIcon;
if (old != selectedIcon)
{
firePropertyChange(SELECTED_ICON_CHANGED_PROPERTY, old,
selectedIcon);
revalidate();
repaint();
}
}
/**
* Returns an single-element array containing the "text" property of the
* button if the "selected" property of the button's model is
* true
, otherwise returns null
.
*
* @return The button's "selected object" array
*/
public Object[] getSelectedObjects()
{
if (isSelected())
{
Object[] objs = new Object[1];
objs[0] = getText();
return objs;
}
else
{
return null;
}
}
/**
* Called when image data becomes available for one of the button's icons.
*
* @param img The image being updated
* @param infoflags One of the constant codes in {@link ImageObserver} used to describe
* updated portions of an image.
* @param x X coordinate of the region being updated
* @param y Y coordinate of the region being updated
* @param w Width of the region beign updated
* @param h Height of the region being updated
*
* @return true
if img is equal to the button's current
* icon, otherwise false
*/
public boolean imageUpdate(Image img, int infoflags, int x, int y, int w,
int h)
{
return current_icon == img;
}
/**
* Returns the value of the button's "contentAreaFilled" property. This
* property indicates whether the area surrounding the text and icon of
* the button should be filled by the look and feel class. If this
* property is false
, the look and feel class should leave
* the content area transparent.
*
* @return The current value of the "contentAreaFilled" property
*/
public boolean isContentAreaFilled()
{
return content_area_filled;
}
/**
* Sets the value of the button's "contentAreaFilled" property. This
* property indicates whether the area surrounding the text and icon of
* the button should be filled by the look and feel class. If this
* property is false
, the look and feel class should leave
* the content area transparent.
*
* @param b The new value of the "contentAreaFilled" property
*/
public void setContentAreaFilled(boolean b)
{
boolean old = content_area_filled;
content_area_filled = b;
if (b != old)
{
firePropertyChange(CONTENT_AREA_FILLED_CHANGED_PROPERTY, old, b);
revalidate();
repaint();
}
}
/**
* Paints the button's border, if the button's "borderPainted" property is
* true
, by out calling to the button's look and feel class.
*
* @param g The graphics context used to paint the border
*/
protected void paintBorder(Graphics g)
{
if (isBorderPainted())
super.paintBorder(g);
}
/**
* Returns a string, used only for debugging, which identifies or somehow
* represents this button. The exact value is implementation-defined.
*
* @return A string representation of the button
*/
protected String paramString()
{
return "AbstractButton";
}
/**
* Set the "UI" property of the button, which is a look and feel class
* responsible for handling the button's input events and painting it.
*
* @param ui The new "UI" property
*/
public void setUI(ButtonUI ui)
{
super.setUI(ui);
}
/**
* Set the "UI" property of the button, which is a look and feel class
* responsible for handling the button's input events and painting it.
*
* @return The current "UI" property
*/
public ButtonUI getUI()
{
return (ButtonUI) ui;
}
/**
* Set the "UI" property to a class constructed, via the {@link
* UIManager}, from the current look and feel. This should be overridden
* for each subclass of AbstractButton, to retrieve a suitable {@link
* ButtonUI} look and feel class.
*/
public void updateUI()
{
}
}