
// DO NOT EDIT THIS FILE - it is machine generated -*- c++ -*-

#ifndef __java_awt_Checkbox__
#define __java_awt_Checkbox__

#pragma interface

#include <java/awt/Component.h>
#include <gcj/array.h>

extern "Java"
{
  namespace java
  {
    namespace awt
    {
        class AWTEvent;
        class Checkbox;
        class CheckboxGroup;
      namespace event
      {
          class ItemEvent;
          class ItemListener;
      }
    }
  }
  namespace javax
  {
    namespace accessibility
    {
        class AccessibleContext;
    }
  }
}

class java::awt::Checkbox : public ::java::awt::Component
{

public:
  Checkbox();
  Checkbox(::java::lang::String *);
  Checkbox(::java::lang::String *, jboolean);
  Checkbox(::java::lang::String *, ::java::awt::CheckboxGroup *, jboolean);
  Checkbox(::java::lang::String *, jboolean, ::java::awt::CheckboxGroup *);
  virtual ::java::lang::String * getLabel();
  virtual void setLabel(::java::lang::String *);
  virtual jboolean getState();
  virtual void setState(jboolean);
  virtual JArray< ::java::lang::Object * > * getSelectedObjects();
  virtual ::java::awt::CheckboxGroup * getCheckboxGroup();
  virtual void setCheckboxGroup(::java::awt::CheckboxGroup *);
  virtual void addNotify();
  virtual JArray< ::java::awt::event::ItemListener * > * getItemListeners();
  virtual void addItemListener(::java::awt::event::ItemListener *);
  virtual void removeItemListener(::java::awt::event::ItemListener *);
public: // actually protected
  virtual void processEvent(::java::awt::AWTEvent *);
  virtual void processItemEvent(::java::awt::event::ItemEvent *);
public: // actually package-private
  virtual void dispatchEventImpl(::java::awt::AWTEvent *);
public: // actually protected
  virtual ::java::lang::String * paramString();
public:
  virtual ::javax::accessibility::AccessibleContext * getAccessibleContext();
public: // actually package-private
  virtual ::java::lang::String * generateName();
private:
  static jlong getUniqueLong();
  static const jlong serialVersionUID = 7270714317450821763LL;
  ::java::awt::CheckboxGroup * __attribute__((aligned(__alignof__( ::java::awt::Component)))) group;
  ::java::lang::String * label;
public: // actually package-private
  jboolean state;
private:
  ::java::awt::event::ItemListener * item_listeners;
  static jlong next_checkbox_number;
public:
  static ::java::lang::Class class$;
};

#endif // __java_awt_Checkbox__
