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

#ifndef __javax_swing_JTextField__
#define __javax_swing_JTextField__

#pragma interface

#include <javax/swing/text/JTextComponent.h>
#include <gcj/array.h>

extern "Java"
{
  namespace java
  {
    namespace awt
    {
        class Dimension;
        class Font;
        class Rectangle;
      namespace event
      {
          class ActionListener;
      }
    }
    namespace beans
    {
        class PropertyChangeListener;
    }
  }
  namespace javax
  {
    namespace accessibility
    {
        class AccessibleContext;
    }
    namespace swing
    {
        class Action;
        class BoundedRangeModel;
        class JTextField;
      namespace text
      {
          class Document;
      }
    }
  }
}

class javax::swing::JTextField : public ::javax::swing::text::JTextComponent
{

public:
  JTextField();
  JTextField(::java::lang::String *);
  JTextField(jint);
  JTextField(::java::lang::String *, jint);
  JTextField(::javax::swing::text::Document *, ::java::lang::String *, jint);
public: // actually protected
  virtual ::javax::swing::text::Document * createDefaultModel();
public:
  virtual void setDocument(::javax::swing::text::Document *);
  virtual ::java::lang::String * getUIClassID();
  virtual void addActionListener(::java::awt::event::ActionListener *);
  virtual void removeActionListener(::java::awt::event::ActionListener *);
  virtual JArray< ::java::awt::event::ActionListener * > * getActionListeners();
public: // actually protected
  virtual void fireActionPerformed();
public:
  virtual jint getColumns();
  virtual void setColumns(jint);
  virtual jint getHorizontalAlignment();
  virtual void setHorizontalAlignment(jint);
  virtual void setFont(::java::awt::Font *);
  virtual ::java::awt::Dimension * getPreferredSize();
  virtual jint getScrollOffset();
  virtual void setScrollOffset(jint);
  virtual JArray< ::javax::swing::Action * > * getActions();
  virtual void postActionEvent();
  virtual ::javax::swing::Action * getAction();
  virtual void setAction(::javax::swing::Action *);
  virtual void setActionCommand(::java::lang::String *);
public: // actually protected
  virtual ::java::beans::PropertyChangeListener * createActionPropertyChangeListener(::javax::swing::Action *);
  virtual void configurePropertiesFromAction(::javax::swing::Action *);
  virtual jint getColumnWidth();
public:
  virtual ::javax::accessibility::AccessibleContext * getAccessibleContext();
  virtual ::javax::swing::BoundedRangeModel * getHorizontalVisibility();
  virtual jboolean isValidateRoot();
  virtual void scrollRectToVisible(::java::awt::Rectangle *);
private:
  static const jlong serialVersionUID = 353853209832607592LL;
  static JArray< ::javax::swing::Action * > * actions;
public:
  static ::java::lang::String * notifyAction;
private:
  jint __attribute__((aligned(__alignof__( ::javax::swing::text::JTextComponent)))) columns;
  jint align;
  ::javax::swing::Action * action;
  ::java::lang::String * actionCommand;
  ::java::beans::PropertyChangeListener * actionPropertyChangeListener;
  ::javax::swing::BoundedRangeModel * horizontalVisibility;
public:
  static ::java::lang::Class class$;
};

#endif // __javax_swing_JTextField__
