View Javadoc
1   /*
2    * Copyright (c) 1997, 2013, Oracle and/or its affiliates. All rights reserved.
3    * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4    *
5    * This code is free software; you can redistribute it and/or modify it
6    * under the terms of the GNU General Public License version 2 only, as
7    * published by the Free Software Foundation.  Oracle designates this
8    * particular file as subject to the "Classpath" exception as provided
9    * by Oracle in the LICENSE file that accompanied this code.
10   *
11   * This code is distributed in the hope that it will be useful, but WITHOUT
12   * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13   * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
14   * version 2 for more details (a copy is included in the LICENSE file that
15   * accompanied this code).
16   *
17   * You should have received a copy of the GNU General Public License version
18   * 2 along with this work; if not, write to the Free Software Foundation,
19   * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20   *
21   * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22   * or visit www.oracle.com if you need additional information or have any
23   * questions.
24   */
25  package javax.swing;
26  
27  import java.awt.*;
28  import java.awt.event.*;
29  import java.beans.*;
30  
31  import javax.swing.plaf.*;
32  import javax.accessibility.*;
33  
34  import java.io.ObjectOutputStream;
35  import java.io.ObjectInputStream;
36  import java.io.IOException;
37  
38  
39  /**
40   * An implementation of a check box -- an item that can be selected or
41   * deselected, and which displays its state to the user.
42   * By convention, any number of check boxes in a group can be selected.
43   * See <a href="http://docs.oracle.com/javase/tutorial/uiswing/components/button.html">How to Use Buttons, Check Boxes, and Radio Buttons</a>
44   * in <em>The Java Tutorial</em>
45   * for examples and information on using check boxes.
46   * <p>
47   * Buttons can be configured, and to some degree controlled, by
48   * <code><a href="Action.html">Action</a></code>s.  Using an
49   * <code>Action</code> with a button has many benefits beyond directly
50   * configuring a button.  Refer to <a href="Action.html#buttonActions">
51   * Swing Components Supporting <code>Action</code></a> for more
52   * details, and you can find more information in <a
53   * href="http://docs.oracle.com/javase/tutorial/uiswing/misc/action.html">How
54   * to Use Actions</a>, a section in <em>The Java Tutorial</em>.
55   * <p>
56   * <strong>Warning:</strong> Swing is not thread safe. For more
57   * information see <a
58   * href="package-summary.html#threading">Swing's Threading
59   * Policy</a>.
60   * <p>
61   * <strong>Warning:</strong>
62   * Serialized objects of this class will not be compatible with
63   * future Swing releases. The current serialization support is
64   * appropriate for short term storage or RMI between applications running
65   * the same version of Swing.  As of 1.4, support for long term storage
66   * of all JavaBeans&trade;
67   * has been added to the <code>java.beans</code> package.
68   * Please see {@link java.beans.XMLEncoder}.
69   *
70   * @see JRadioButton
71   *
72   * @beaninfo
73   *   attribute: isContainer false
74   * description: A component which can be selected or deselected.
75   *
76   * @author Jeff Dinkins
77   */
78  public class JCheckBox extends JToggleButton implements Accessible {
79  
80      /** Identifies a change to the flat property. */
81      public static final String BORDER_PAINTED_FLAT_CHANGED_PROPERTY = "borderPaintedFlat";
82  
83      private boolean flat = false;
84  
85      /**
86       * @see #getUIClassID
87       * @see #readObject
88       */
89      private static final String uiClassID = "CheckBoxUI";
90  
91  
92      /**
93       * Creates an initially unselected check box button with no text, no icon.
94       */
95      public JCheckBox () {
96          this(null, null, false);
97      }
98  
99      /**
100      * Creates an initially unselected check box with an icon.
101      *
102      * @param icon  the Icon image to display
103      */
104     public JCheckBox(Icon icon) {
105         this(null, icon, false);
106     }
107 
108     /**
109      * Creates a check box with an icon and specifies whether
110      * or not it is initially selected.
111      *
112      * @param icon  the Icon image to display
113      * @param selected a boolean value indicating the initial selection
114      *        state. If <code>true</code> the check box is selected
115      */
116     public JCheckBox(Icon icon, boolean selected) {
117         this(null, icon, selected);
118     }
119 
120     /**
121      * Creates an initially unselected check box with text.
122      *
123      * @param text the text of the check box.
124      */
125     public JCheckBox (String text) {
126         this(text, null, false);
127     }
128 
129     /**
130      * Creates a check box where properties are taken from the
131      * Action supplied.
132      *
133      * @since 1.3
134      */
135     public JCheckBox(Action a) {
136         this();
137         setAction(a);
138     }
139 
140 
141     /**
142      * Creates a check box with text and specifies whether
143      * or not it is initially selected.
144      *
145      * @param text the text of the check box.
146      * @param selected a boolean value indicating the initial selection
147      *        state. If <code>true</code> the check box is selected
148      */
149     public JCheckBox (String text, boolean selected) {
150         this(text, null, selected);
151     }
152 
153     /**
154      * Creates an initially unselected check box with
155      * the specified text and icon.
156      *
157      * @param text the text of the check box.
158      * @param icon  the Icon image to display
159      */
160     public JCheckBox(String text, Icon icon) {
161         this(text, icon, false);
162     }
163 
164     /**
165      * Creates a check box with text and icon,
166      * and specifies whether or not it is initially selected.
167      *
168      * @param text the text of the check box.
169      * @param icon  the Icon image to display
170      * @param selected a boolean value indicating the initial selection
171      *        state. If <code>true</code> the check box is selected
172      */
173     public JCheckBox (String text, Icon icon, boolean selected) {
174         super(text, icon, selected);
175         setUIProperty("borderPainted", Boolean.FALSE);
176         setHorizontalAlignment(LEADING);
177     }
178 
179     /**
180      * Sets the <code>borderPaintedFlat</code> property,
181      * which gives a hint to the look and feel as to the
182      * appearance of the check box border.
183      * This is usually set to <code>true</code> when a
184      * <code>JCheckBox</code> instance is used as a
185      * renderer in a component such as a <code>JTable</code> or
186      * <code>JTree</code>.  The default value for the
187      * <code>borderPaintedFlat</code> property is <code>false</code>.
188      * This method fires a property changed event.
189      * Some look and feels might not implement flat borders;
190      * they will ignore this property.
191      *
192      * @param b <code>true</code> requests that the border be painted flat;
193      *          <code>false</code> requests normal borders
194      * @see #isBorderPaintedFlat
195      * @beaninfo
196      *        bound: true
197      *    attribute: visualUpdate true
198      *  description: Whether the border is painted flat.
199      * @since 1.3
200      */
201     public void setBorderPaintedFlat(boolean b) {
202         boolean oldValue = flat;
203         flat = b;
204         firePropertyChange(BORDER_PAINTED_FLAT_CHANGED_PROPERTY, oldValue, flat);
205         if (b != oldValue) {
206             revalidate();
207             repaint();
208         }
209     }
210 
211     /**
212      * Gets the value of the <code>borderPaintedFlat</code> property.
213      *
214      * @return the value of the <code>borderPaintedFlat</code> property
215      * @see #setBorderPaintedFlat
216      * @since 1.3
217      */
218     public boolean isBorderPaintedFlat() {
219         return flat;
220     }
221 
222     /**
223      * Resets the UI property to a value from the current look and feel.
224      *
225      * @see JComponent#updateUI
226      */
227     public void updateUI() {
228         setUI((ButtonUI)UIManager.getUI(this));
229     }
230 
231 
232     /**
233      * Returns a string that specifies the name of the L&amp;F class
234      * that renders this component.
235      *
236      * @return the string "CheckBoxUI"
237      * @see JComponent#getUIClassID
238      * @see UIDefaults#getUI
239      * @beaninfo
240      *        expert: true
241      *   description: A string that specifies the name of the L&amp;F class
242      */
243     public String getUIClassID() {
244         return uiClassID;
245     }
246 
247 
248     /**
249      * The icon for checkboxs comes from the look and feel,
250      * not the Action; this is overriden to do nothing.
251      */
252     void setIconFromAction(Action a) {
253     }
254 
255      /*
256       * See readObject and writeObject in JComponent for more
257       * information about serialization in Swing.
258       */
259      private void writeObject(ObjectOutputStream s) throws IOException {
260         s.defaultWriteObject();
261         if (getUIClassID().equals(uiClassID)) {
262             byte count = JComponent.getWriteObjCounter(this);
263             JComponent.setWriteObjCounter(this, --count);
264             if (count == 0 && ui != null) {
265                 ui.installUI(this);
266             }
267         }
268      }
269 
270 
271     /**
272      * See JComponent.readObject() for information about serialization
273      * in Swing.
274      */
275     private void readObject(ObjectInputStream s)
276         throws IOException, ClassNotFoundException
277     {
278         s.defaultReadObject();
279         if (getUIClassID().equals(uiClassID)) {
280             updateUI();
281         }
282     }
283 
284 
285     /**
286      * Returns a string representation of this JCheckBox. This method
287      * is intended to be used only for debugging purposes, and the
288      * content and format of the returned string may vary between
289      * implementations. The returned string may be empty but may not
290      * be <code>null</code>.
291      * specific new aspects of the JFC components.
292      *
293      * @return  a string representation of this JCheckBox.
294      */
295     protected String paramString() {
296         return super.paramString();
297     }
298 
299 /////////////////
300 // Accessibility support
301 ////////////////
302 
303     /**
304      * Gets the AccessibleContext associated with this JCheckBox.
305      * For JCheckBoxes, the AccessibleContext takes the form of an
306      * AccessibleJCheckBox.
307      * A new AccessibleJCheckBox instance is created if necessary.
308      *
309      * @return an AccessibleJCheckBox that serves as the
310      *         AccessibleContext of this JCheckBox
311      * @beaninfo
312      *       expert: true
313      *  description: The AccessibleContext associated with this CheckBox.
314      */
315     public AccessibleContext getAccessibleContext() {
316         if (accessibleContext == null) {
317             accessibleContext = new AccessibleJCheckBox();
318         }
319         return accessibleContext;
320     }
321 
322     /**
323      * This class implements accessibility support for the
324      * <code>JCheckBox</code> class.  It provides an implementation of the
325      * Java Accessibility API appropriate to check box user-interface
326      * elements.
327      * <p>
328      * <strong>Warning:</strong>
329      * Serialized objects of this class will not be compatible with
330      * future Swing releases. The current serialization support is
331      * appropriate for short term storage or RMI between applications running
332      * the same version of Swing.  As of 1.4, support for long term storage
333      * of all JavaBeans&trade;
334      * has been added to the <code>java.beans</code> package.
335      * Please see {@link java.beans.XMLEncoder}.
336      */
337     protected class AccessibleJCheckBox extends AccessibleJToggleButton {
338 
339         /**
340          * Get the role of this object.
341          *
342          * @return an instance of AccessibleRole describing the role of the object
343          * @see AccessibleRole
344          */
345         public AccessibleRole getAccessibleRole() {
346             return AccessibleRole.CHECK_BOX;
347         }
348 
349     } // inner class AccessibleJCheckBox
350 }