001 /* JButton.java --
002 Copyright (C) 2002, 2004, 2005, 2006, Free Software Foundation, Inc.
003
004 This file is part of GNU Classpath.
005
006 GNU Classpath is free software; you can redistribute it and/or modify
007 it under the terms of the GNU General Public License as published by
008 the Free Software Foundation; either version 2, or (at your option)
009 any later version.
010
011 GNU Classpath is distributed in the hope that it will be useful, but
012 WITHOUT ANY WARRANTY; without even the implied warranty of
013 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
014 General Public License for more details.
015
016 You should have received a copy of the GNU General Public License
017 along with GNU Classpath; see the file COPYING. If not, write to the
018 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
019 02110-1301 USA.
020
021 Linking this library statically or dynamically with other modules is
022 making a combined work based on this library. Thus, the terms and
023 conditions of the GNU General Public License cover the whole
024 combination.
025
026 As a special exception, the copyright holders of this library give you
027 permission to link this library with independent modules to produce an
028 executable, regardless of the license terms of these independent
029 modules, and to copy and distribute the resulting executable under
030 terms of your choice, provided that you also meet, for each linked
031 independent module, the terms and conditions of the license of that
032 module. An independent module is a module which is not derived from
033 or based on this library. If you modify this library, you may extend
034 this exception to your version of the library, but you are not
035 obligated to do so. If you do not wish to do so, delete this
036 exception statement from your version. */
037
038 package javax.swing;
039
040 import javax.accessibility.Accessible;
041 import javax.accessibility.AccessibleContext;
042 import javax.accessibility.AccessibleRole;
043 import javax.swing.plaf.ButtonUI;
044
045
046 /**
047 * A general purpose push button. <code>JButton</code>s can display a label,
048 * an {@link Icon} or both.
049 *
050 * @author Ronald Veldema (rveldema@cs.vu.nl)
051 */
052 public class JButton extends AbstractButton
053 implements Accessible
054 {
055
056 /**
057 * Accessibility support for JButtons.
058 */
059 protected class AccessibleJButton
060 extends AbstractButton.AccessibleAbstractButton
061 {
062 /**
063 * Returns the accessible role that this component represents.
064 * This is {@link AccessibleRole#PUSH_BUTTON} for <code>JButton</code>s.
065 *
066 * @return the accessible role that this component represents
067 */
068 public AccessibleRole getAccessibleRole()
069 {
070 return AccessibleRole.PUSH_BUTTON;
071 }
072 }
073
074 private static final long serialVersionUID = -1907255238954382202L;
075
076 /**
077 * Indicates if this button is capable to become the default button.
078 */
079 private boolean defaultCapable;
080
081 /**
082 * Creates a new button with an empty string for the button text and no
083 * icon.
084 */
085 public JButton()
086 {
087 this(null, null);
088 }
089
090 /**
091 * Creates a new button from the specified action.
092 *
093 * @param a the action (<code>null</code> permitted).
094 *
095 * @see AbstractButton#setAction(Action)
096 */
097 public JButton(Action a)
098 {
099 this();
100 setAction(a);
101 }
102
103 /**
104 * Creates a new button with the specified icon (and an empty string for
105 * the button text).
106 *
107 * @param icon the icon (<code>null</code> permitted).
108 */
109 public JButton(Icon icon)
110 {
111 this(null, icon);
112 }
113
114 /**
115 * Creates a new button with the specified text and no icon.
116 *
117 * @param text the button text (<code>null</code> permitted, will be
118 * substituted by an empty string).
119 */
120 public JButton(String text)
121 {
122 this(text, null);
123 }
124
125 /**
126 * Creates a new button with the specified text and icon.
127 *
128 * @param text the button text (<code>null</code> permitted, will be
129 * substituted by an empty string).
130 * @param icon the icon (<code>null</code> permitted).
131 */
132 public JButton(String text, Icon icon)
133 {
134 super();
135 setModel(new DefaultButtonModel());
136 init(text, icon);
137 defaultCapable = true;
138 }
139
140 protected void configurePropertiesFromAction(Action a)
141 {
142 super.configurePropertiesFromAction(a);
143 }
144
145 /**
146 * Returns the object that provides accessibility features for this
147 * <code>JButton</code> component.
148 *
149 * @return The accessible context (an instance of {@link AccessibleJButton}).
150 */
151 public AccessibleContext getAccessibleContext()
152 {
153 if (accessibleContext == null)
154 accessibleContext = new AccessibleJButton();
155 return accessibleContext;
156 }
157
158 /**
159 * Returns the suffix (<code>"ButtonUI"</code> in this case) used to
160 * determine the class name for a UI delegate that can provide the look and
161 * feel for a <code>JButton</code>.
162 *
163 * @return <code>"ButtonUI"</code>.
164 */
165 public String getUIClassID()
166 {
167 // Returns a string that specifies the name of the L&F class that renders
168 // this component.
169 return "ButtonUI";
170 }
171
172 /**
173 * Returns <code>true</code> if this button is the default button in
174 * its <code>JRootPane</code>. The default button gets automatically
175 * activated when the user presses <code>ENTER</code> (or whatever
176 * key this is bound to in the current Look and Feel).
177 *
178 * @return <code>true</code> if this button is the default button in
179 * its <code>JRootPane</code>
180 *
181 * @see #isDefaultCapable()
182 * @see #setDefaultCapable(boolean)
183 * @see JRootPane#getDefaultButton()
184 * @see JRootPane#setDefaultButton(JButton)
185 */
186 public boolean isDefaultButton()
187 {
188 // The default button is managed by the JRootPane, so the safest way
189 // to determine this property is to ask the root pane of this button,
190 // if it exists.
191 JRootPane rp = SwingUtilities.getRootPane(this);
192 boolean isDefault = false;
193 if (rp != null)
194 isDefault = rp.getDefaultButton() == this;
195 return isDefault;
196 }
197
198 /**
199 * Returns <code>true</code> if this button can act as the default button.
200 * This is <code>true</code> by default.
201 *
202 * @return <code>true</code> if this button can act as the default button
203 *
204 * @see #setDefaultCapable(boolean)
205 * @see #isDefaultButton()
206 * @see JRootPane#getDefaultButton()
207 * @see JRootPane#setDefaultButton(JButton)
208 */
209 public boolean isDefaultCapable()
210 {
211 // Returns whether or not this button is capable of being the default
212 // button on the RootPane.
213 return defaultCapable;
214 }
215
216 /**
217 * Returns an implementation-dependent string describing the attributes of
218 * this <code>JButton</code>.
219 *
220 * @return A string describing the attributes of this <code>JButton</code>
221 * (never <code>null</code>).
222 */
223 protected String paramString()
224 {
225 String superParam = super.paramString();
226
227 // 41 is the maximum number of chars which may be needed.
228 StringBuffer sb = new StringBuffer(41);
229 sb.append(",defaultButton=").append(isDefaultButton());
230 sb.append(",defaultCapable=").append(defaultCapable);
231
232 return superParam + sb.toString();
233 }
234
235 /**
236 * Overrides JComponent.removeNotify to check if this button is currently
237 * set as the default button on the RootPane, and if so, sets the RootPane's
238 * default button to null to ensure the RootPane doesn't hold onto an invalid
239 * button reference.
240 */
241 public void removeNotify()
242 {
243 JRootPane root = SwingUtilities.getRootPane(this);
244 if (root != null && root.getDefaultButton() == this)
245 root.setDefaultButton(null);
246 super.removeNotify();
247 }
248
249 /**
250 * Sets the <code>defaultCapable</code> property which indicates if
251 * this button may become the default button in its <code>JRootPane</code>.
252 *
253 * @param defaultCapable <code>true</code> if this button can become the
254 * default button in its JRootPane, <code>false</code> otherwise
255 *
256 * @see #setDefaultCapable(boolean)
257 * @see #isDefaultButton()
258 * @see JRootPane#getDefaultButton()
259 * @see JRootPane#setDefaultButton(JButton)
260 */
261 public void setDefaultCapable(boolean defaultCapable)
262 {
263 this.defaultCapable = defaultCapable;
264 }
265
266 /**
267 * Sets this button's UI delegate to the default (obtained from the
268 * {@link UIManager}) for the current look and feel.
269 */
270 public void updateUI()
271 {
272 setUI((ButtonUI) UIManager.getUI(this));
273 }
274 }