1 /*
   2  * Copyright (c) 1997, 2006, 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<sup><font size="-2">TM</font></sup>
  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<sup><font size="-2">TM</font></sup>
 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 }