FileDocCategorySizeDatePackage
JTextComponent.javaAPI DocJava SE 6 API180768Tue Jun 10 00:26:58 BST 2008javax.swing.text

JTextComponent

public abstract class JTextComponent extends JComponent implements Scrollable, Accessible
JTextComponent is the base class for swing text components. It tries to be compatible with the java.awt.TextComponent class where it can reasonably do so. Also provided are other services for additional flexibility (beyond the pluggable UI and bean support). You can find information on how to use the functionality this class provides in General Rules for Using Text Components, a section in The Java Tutorial.

Caret Changes
The caret is a pluggable object in swing text components. Notification of changes to the caret position and the selection are sent to implementations of the CaretListener interface that have been registered with the text component. The UI will install a default caret unless a customized caret has been set.
By default the caret tracks all the document changes performed on the Event Dispatching Thread and updates it's position accordingly if an insertion occurs before or at the caret position or a removal occurs before the caret position. DefaultCaret tries to make itself visible which may lead to scrolling of a text component within JScrollPane. The default caret behavior can be changed by the {@link DefaultCaret#setUpdatePolicy} method.
Note: Non-editable text components also have a caret though it may not be painted.

Commands
Text components provide a number of commands that can be used to manipulate the component. This is essentially the way that the component expresses its capabilities. These are expressed in terms of the swing Action interface, using the TextAction implementation. The set of commands supported by the text component can be found with the {@link #getActions} method. These actions can be bound to key events, fired from buttons, etc.

Text Input
The text components support flexible and internationalized text input, using keymaps and the input method framework, while maintaining compatibility with the AWT listener model.

A {@link javax.swing.text.Keymap} lets an application bind key strokes to actions. In order to allow keymaps to be shared across multiple text components, they can use actions that extend TextAction. TextAction can determine which JTextComponent most recently has or had focus and therefore is the subject of the action (In the case that the ActionEvent sent to the action doesn't contain the target text component as its source).

The input method framework lets text components interact with input methods, separate software components that preprocess events to let users enter thousands of different characters using keyboards with far fewer keys. JTextComponent is an active client of the framework, so it implements the preferred user interface for interacting with input methods. As a consequence, some key events do not reach the text component because they are handled by an input method, and some text input reaches the text component as committed text within an {@link java.awt.event.InputMethodEvent} instead of as a key event. The complete text input is the combination of the characters in keyTyped key events and committed text in input method events.

The AWT listener model lets applications attach event listeners to components in order to bind events to actions. Swing encourages the use of keymaps instead of listeners, but maintains compatibility with listeners by giving the listeners a chance to steal an event by consuming it.

Keyboard event and input method events are handled in the following stages, with each stage capable of consuming the event:

Stage

KeyEvent

InputMethodEvent

1. input methods (generated here)
2. focus manager
3. registered key listeners registered input method listeners
4. input method handling in JTextComponent
5. keymap handling using the current keymap
6. keyboard handling in JComponent (e.g. accelerators, component navigation, etc.)

To maintain compatibility with applications that listen to key events but are not aware of input method events, the input method handling in stage 4 provides a compatibility mode for components that do not process input method events. For these components, the committed text is converted to keyTyped key events and processed in the key event pipeline starting at stage 3 instead of in the input method event pipeline.

By default the component will create a keymap (named DEFAULT_KEYMAP) that is shared by all JTextComponent instances as the default keymap. Typically a look-and-feel implementation will install a different keymap that resolves to the default keymap for those bindings not found in the different keymap. The minimal bindings include:

  • inserting content into the editor for the printable keys.
  • removing content with the backspace and del keys.
  • caret movement forward and backward

Model/View Split
The text components have a model-view split. A text component pulls together the objects used to represent the model, view, and controller. The text document model may be shared by other views which act as observers of the model (e.g. a document may be shared by multiple components).

Diagram showing interaction between Controller, Document, events, and ViewFactory

The model is defined by the {@link Document} interface. This is intended to provide a flexible text storage mechanism that tracks change during edits and can be extended to more sophisticated models. The model interfaces are meant to capture the capabilities of expression given by SGML, a system used to express a wide variety of content. Each modification to the document causes notification of the details of the change to be sent to all observers in the form of a {@link DocumentEvent} which allows the views to stay up to date with the model. This event is sent to observers that have implemented the {@link DocumentListener} interface and registered interest with the model being observed.

Location Information
The capability of determining the location of text in the view is provided. There are two methods, {@link #modelToView} and {@link #viewToModel} for determining this information.

Undo/Redo support
Support for an edit history mechanism is provided to allow undo/redo operations. The text component does not itself provide the history buffer by default, but does provide the UndoableEdit records that can be used in conjunction with a history buffer to provide the undo/redo support. The support is provided by the Document model, which allows one to attach UndoableEditListener implementations.

Thread Safety
The swing text components provide some support of thread safe operations. Because of the high level of configurability of the text components, it is possible to circumvent the protection provided. The protection primarily comes from the model, so the documentation of AbstractDocument describes the assumptions of the protection provided. The methods that are safe to call asynchronously are marked with comments.

Newlines
For a discussion on how newlines are handled, see DefaultEditorKit.

Printing support
Several {@link #print print} methods are provided for basic document printing. If more advanced printing is needed, use the {@link #getPrintable} method.

Warning: Serialized objects of this class will not be compatible with future Swing releases. The current serialization support is appropriate for short term storage or RMI between applications running the same version of Swing. As of 1.4, support for long term storage of all JavaBeansTM has been added to the java.beans package. Please see {@link java.beans.XMLEncoder}.

beaninfo
attribute: isContainer false
author
Timothy Prinzing
author
Igor Kushnirskiy (printing support)
version
1.229 08/03/06
see
Document
see
DocumentEvent
see
DocumentListener
see
Caret
see
CaretEvent
see
CaretListener
see
TextUI
see
View
see
ViewFactory

Fields Summary
public static final String
FOCUS_ACCELERATOR_KEY
The bound property name for the focus accelerator.
private Document
model
The document model.
private transient Caret
caret
The caret used to display the insert position and navigate throughout the document. PENDING(prinz) This should be serializable, default installed by UI.
private NavigationFilter
navigationFilter
Object responsible for restricting the cursor navigation.
private transient Highlighter
highlighter
The object responsible for managing highlights. PENDING(prinz) This should be serializable, default installed by UI.
private transient Keymap
keymap
The current key bindings in effect. PENDING(prinz) This should be serializable, default installed by UI.
private transient MutableCaretEvent
caretEvent
private Color
caretColor
private Color
selectionColor
private Color
selectedTextColor
private Color
disabledTextColor
private boolean
editable
private Insets
margin
private char
focusAccelerator
private boolean
dragEnabled
private DropMode
dropMode
The drop mode for this component.
private transient DropLocation
dropLocation
The drop location.
private static DefaultTransferHandler
defaultTransferHandler
TransferHandler used if one hasn't been supplied by the UI.
private static Map
overrideMap
Maps from class name to Boolean indicating if processInputMethodEvent has been overriden.
private static final Object
KEYMAP_TABLE
private JTextComponent
editor
private transient InputMethodRequests
inputMethodRequestsHandler
private SimpleAttributeSet
composedTextAttribute
private String
composedTextContent
private Position
composedTextStart
private Position
composedTextEnd
private Position
latestCommittedTextStart
private Position
latestCommittedTextEnd
private ComposedTextCaret
composedTextCaret
private transient Caret
originalCaret
private boolean
checkedInputOverride
Set to true after the check for the override of processInputMethodEvent has been checked.
private boolean
needToSendKeyTypedEvent
private static final Object
FOCUSED_COMPONENT
public static final String
DEFAULT_KEYMAP
The default keymap that will be shared by all JTextComponent instances unless they have had a different keymap set.
Constructors Summary
public JTextComponent()
Creates a new JTextComponent. Listeners for caret events are established, and the pluggable UI installed. The component is marked as editable. No layout manager is used, because layout is managed by the view subsystem of text. The document model is set to null.

        super();
	// enable InputMethodEvent for on-the-spot pre-editing
	enableEvents(AWTEvent.KEY_EVENT_MASK | AWTEvent.INPUT_METHOD_EVENT_MASK);
        caretEvent = new MutableCaretEvent(this);
        addMouseListener(caretEvent);
        addFocusListener(caretEvent);
        setEditable(true);
	setDragEnabled(false);
        setLayout(null); // layout is managed by View hierarchy
        updateUI();
    
Methods Summary
public voidaddCaretListener(javax.swing.event.CaretListener listener)
Adds a caret listener for notification of any changes to the caret.

param
listener the listener to be added
see
javax.swing.event.CaretEvent

        listenerList.add(CaretListener.class, listener);
    
public voidaddInputMethodListener(java.awt.event.InputMethodListener l)

    	super.addInputMethodListener(l);
	if (l != null) {
	    needToSendKeyTypedEvent = false;
            checkedInputOverride = true;
	}
    
public static javax.swing.text.KeymapaddKeymap(java.lang.String nm, javax.swing.text.Keymap parent)
Adds a new keymap into the keymap hierarchy. Keymap bindings resolve from bottom up so an attribute specified in a child will override an attribute specified in the parent.

param
nm the name of the keymap (must be unique within the collection of named keymaps in the document); the name may be null if the keymap is unnamed, but the caller is responsible for managing the reference returned as an unnamed keymap can't be fetched by name
param
parent the parent keymap; this may be null if unspecified bindings need not be resolved in some other keymap
return
the keymap

        Keymap map = new DefaultKeymap(nm, parent); 
        if (nm != null) {
            // add a named keymap, a class of bindings
            getKeymapTable().put(nm, map);
        }
        return map;
    
booleancomposedTextExists()

	return (composedTextStart != null);
    
public voidcopy()
Transfers the currently selected range in the associated text model to the system clipboard, leaving the contents in the text model. The current selection remains intact. Does nothing for null selections.

see
java.awt.Toolkit#getSystemClipboard
see
java.awt.datatransfer.Clipboard

        invokeAction("copy", TransferHandler.getCopyAction());
    
private voidcreateComposedTextAttribute(int composedIndex, java.text.AttributedCharacterIterator text)

	Document doc = getDocument();
        StringBuffer strBuf = new StringBuffer();

	// create attributed string with no attributes
	for (char c = text.setIndex(composedIndex); 
             c != CharacterIterator.DONE; c = text.next()) {
	    strBuf.append(c);
	}
	
	composedTextContent = new String(strBuf);	
	composedTextAttribute = new SimpleAttributeSet();	
	composedTextAttribute.addAttribute(StyleConstants.ComposedTextAttribute, 
		new AttributedString(text, composedIndex, text.getEndIndex()));
    
public voidcut()
Transfers the currently selected range in the associated text model to the system clipboard, removing the contents from the model. The current selection is reset. Does nothing for null selections.

see
java.awt.Toolkit#getSystemClipboard
see
java.awt.datatransfer.Clipboard

	if (isEditable() && isEnabled()) {
            invokeAction("cut", TransferHandler.getCutAction());
	}
    
javax.swing.text.JTextComponent$DropLocationdropLocationForPoint(java.awt.Point p)
Calculates a drop location in this component, representing where a drop at the given point should insert data.

Note: This method is meant to override JComponent.dropLocationForPoint(), which is package-private in javax.swing. TransferHandler will detect text components and call this method instead via reflection. It's name should therefore not be changed.

param
p the point to calculate a drop location for
return
the drop location, or null

        Position.Bias[] bias = new Position.Bias[1];
        int index = getUI().viewToModel(this, p, bias);

        // viewToModel currently returns null for some HTML content
        // when the point is within the component's top inset
        if (bias[0] == null) {
            bias[0] = Position.Bias.Forward;
        }

        return new DropLocation(p, index, bias[0]);
    
private voidexchangeCaret(javax.swing.text.Caret oldCaret, javax.swing.text.Caret newCaret)

	int blinkRate = oldCaret.getBlinkRate();
	setCaret(newCaret);
	caret.setBlinkRate(blinkRate);
	caret.setVisible(hasFocus());
    
protected voidfireCaretUpdate(javax.swing.event.CaretEvent e)
Notifies all listeners that have registered interest for notification on this event type. The event instance is lazily created using the parameters passed into the fire method. The listener list is processed in a last-to-first manner.

param
e the event
see
EventListenerList

        // Guaranteed to return a non-null array
        Object[] listeners = listenerList.getListenerList();
        // Process the listeners last to first, notifying
        // those that are interested in this event
        for (int i = listeners.length-2; i>=0; i-=2) {
            if (listeners[i]==CaretListener.class) {
                ((CaretListener)listeners[i+1]).caretUpdate(e);
            }
        }
    
public javax.accessibility.AccessibleContextgetAccessibleContext()
Gets the AccessibleContext associated with this JTextComponent. For text components, the AccessibleContext takes the form of an AccessibleJTextComponent. A new AccessibleJTextComponent instance is created if necessary.

return
an AccessibleJTextComponent that serves as the AccessibleContext of this JTextComponent

        if (accessibleContext == null) {
            accessibleContext = new AccessibleJTextComponent();
        }
        return accessibleContext;
    
public javax.swing.Action[]getActions()
Fetches the command list for the editor. This is the list of commands supported by the plugged-in UI augmented by the collection of commands that the editor itself supports. These are useful for binding to events, such as in a keymap.

return
the command list

      
        return getUI().getEditorKit(this).getActions(); 
    
public javax.swing.text.CaretgetCaret()
Fetches the caret that allows text-oriented navigation over the view.

return
the caret

        return caret;
    
public java.awt.ColorgetCaretColor()
Fetches the current color used to render the caret.

return
the color

        return caretColor;
    
public javax.swing.event.CaretListener[]getCaretListeners()
Returns an array of all the caret listeners registered on this text component.

return
all of this component's CaretListeners or an empty array if no caret listeners are currently registered
see
#addCaretListener
see
#removeCaretListener
since
1.4

        return (CaretListener[])listenerList.getListeners(CaretListener.class);
    
public intgetCaretPosition()
Returns the position of the text insertion caret for the text component.

return
the position of the text insertion caret for the text component >= 0

        return caret.getDot();
    
private intgetCurrentEventModifiers()

        int modifiers = 0;
        AWTEvent currentEvent = EventQueue.getCurrentEvent();
        if (currentEvent instanceof InputEvent) {
            modifiers = ((InputEvent)currentEvent).getModifiers();
        } else if (currentEvent instanceof ActionEvent) {
            modifiers = ((ActionEvent)currentEvent).getModifiers();
        }
        return modifiers;
    
public java.awt.ColorgetDisabledTextColor()
Fetches the current color used to render the disabled text.

return
the color

        return disabledTextColor;
    
public javax.swing.text.DocumentgetDocument()
Fetches the model associated with the editor. This is primarily for the UI to get at the minimal amount of state required to be a text editor. Subclasses will return the actual type of the model which will typically be something that extends Document.

return
the model

        return model;
    
public booleangetDragEnabled()
Returns whether or not automatic drag handling is enabled.

return
the value of the {@code dragEnabled} property
see
#setDragEnabled
since
1.4

	return dragEnabled;
    
public final javax.swing.text.JTextComponent$DropLocationgetDropLocation()
Returns the location that this component should visually indicate as the drop location during a DnD operation over the component, or {@code null} if no location is to currently be shown.

This method is not meant for querying the drop location from a {@code TransferHandler}, as the drop location is only set after the {@code TransferHandler}'s canImport has returned and has allowed for the location to be shown.

When this property changes, a property change event with name "dropLocation" is fired by the component.

return
the drop location
see
#setDropMode
see
TransferHandler#canImport(TransferHandler.TransferSupport)
since
1.6

        return dropLocation;
    
public final javax.swing.DropModegetDropMode()
Returns the drop mode for this component.

return
the drop mode for this component
see
#setDropMode
since
1.6

        return dropMode;
    
public chargetFocusAccelerator()
Returns the key accelerator that will cause the receiving text component to get the focus. Return '\0' if no focus accelerator has been set.

return
the key

        return focusAccelerator;
    
static final javax.swing.text.JTextComponentgetFocusedComponent()
Returns the JTextComponent that most recently had focus. The returned value may currently have focus.

        return (JTextComponent)AppContext.getAppContext().
            get(FOCUSED_COMPONENT);
    
public javax.swing.text.HighlightergetHighlighter()
Fetches the object responsible for making highlights.

return
the highlighter

        return highlighter;
    
public java.awt.im.InputMethodRequestsgetInputMethodRequests()

    	if (inputMethodRequestsHandler == null) {
	    inputMethodRequestsHandler = 
	        (InputMethodRequests)new InputMethodRequestsHandler();
	    Document doc = getDocument();
	    if (doc != null) {
		doc.addDocumentListener((DocumentListener)inputMethodRequestsHandler);
	    }
	}

	return inputMethodRequestsHandler;
    
public javax.swing.text.KeymapgetKeymap()
Fetches the keymap currently active in this text component.

return
the keymap

        return keymap;
    
public static javax.swing.text.KeymapgetKeymap(java.lang.String nm)
Fetches a named keymap previously added to the document. This does not work with null-named keymaps.

param
nm the name of the keymap
return
the keymap

        return getKeymapTable().get(nm);
    
private static java.util.HashMapgetKeymapTable()

        synchronized (KEYMAP_TABLE) {
            AppContext appContext = AppContext.getAppContext();
            HashMap<String,Keymap> keymapTable = 
                (HashMap<String,Keymap>)appContext.get(KEYMAP_TABLE);
            if (keymapTable == null) {
                keymapTable = new HashMap<String,Keymap>(17);
                appContext.put(KEYMAP_TABLE, keymapTable);
                //initialize default keymap
                Keymap binding = addKeymap(DEFAULT_KEYMAP, null);
                binding.setDefaultAction(new 
                                         DefaultEditorKit.DefaultKeyTypedAction());
            }
            return keymapTable;
        }
    
public java.awt.InsetsgetMargin()
Returns the margin between the text component's border and its text.

return
the margin

        return margin;
    
public javax.swing.text.NavigationFiltergetNavigationFilter()
Returns the NavigationFilter. NavigationFilter is used by DefaultCaret and the default cursor movement actions as a way to restrict the cursor movement. A null return value implies the cursor movement and selection should not be restricted.

since
1.4
return
the NavigationFilter

        return navigationFilter;
    
public java.awt.DimensiongetPreferredScrollableViewportSize()
Returns the preferred size of the viewport for a view component. This is implemented to do the default behavior of returning the preferred size of the component.

return
the preferredSize of a JViewport whose view is this Scrollable

        return getPreferredSize();
    
public java.awt.print.PrintablegetPrintable(java.text.MessageFormat headerFormat, java.text.MessageFormat footerFormat)
Returns a {@code Printable} to use for printing the content of this {@code JTextComponent}. The returned {@code Printable} prints the document as it looks on the screen except being reformatted to fit the paper. The returned {@code Printable} can be wrapped inside another {@code Printable} in order to create complex reports and documents.

The returned {@code Printable} shares the {@code document} with this {@code JTextComponent}. It is the responsibility of the developer to ensure that the {@code document} is not mutated while this {@code Printable} is used. Printing behavior is undefined when the {@code document} is mutated during printing.

Page header and footer text can be added to the output by providing {@code MessageFormat} arguments. The printing code requests {@code Strings} from the formats, providing a single item which may be included in the formatted string: an {@code Integer} representing the current page number.

The returned {@code Printable} when printed, formats the document content appropriately for the page size. For correct line wrapping the {@code imageable width} of all pages must be the same. See {@link java.awt.print.PageFormat#getImageableWidth}.

This method is thread-safe, although most Swing methods are not. Please see How to Use Threads for more information.

The returned {@code Printable} can be printed on any thread.

This implementation returned {@code Printable} performs all painting on the Event Dispatch Thread, regardless of what thread it is used on.

param
headerFormat the text, in {@code MessageFormat}, to be used as the header, or {@code null} for no header
param
footerFormat the text, in {@code MessageFormat}, to be used as the footer, or {@code null} for no footer
return
a {@code Printable} for use in printing content of this {@code JTextComponent}
see
java.awt.print.Printable
see
java.awt.print.PageFormat
see
javax.swing.text.Document#render(java.lang.Runnable)
since
1.6

        return TextComponentPrintable.getPrintable(
                   this, headerFormat, footerFormat);
    
public intgetScrollableBlockIncrement(java.awt.Rectangle visibleRect, int orientation, int direction)
Components that display logical rows or columns should compute the scroll increment that will completely expose one block of rows or columns, depending on the value of orientation.

The default implementation of this is to simply return the visible area. Subclasses will likely be able to provide a much more reasonable value.

param
visibleRect the view area visible within the viewport
param
orientation either SwingConstants.VERTICAL or SwingConstants.HORIZONTAL
param
direction less than zero to scroll up/left, greater than zero for down/right
return
the "block" increment for scrolling in the specified direction
exception
IllegalArgumentException for an invalid orientation
see
JScrollBar#setBlockIncrement

        switch(orientation) {
        case SwingConstants.VERTICAL:
            return visibleRect.height;
        case SwingConstants.HORIZONTAL:
            return visibleRect.width;
        default:
            throw new IllegalArgumentException("Invalid orientation: " + orientation);
        }
    
public booleangetScrollableTracksViewportHeight()
Returns true if a viewport should always force the height of this Scrollable to match the height of the viewport. For example a columnar text view that flowed text in left to right columns could effectively disable vertical scrolling by returning true here.

Scrolling containers, like JViewport, will use this method each time they are validated.

return
true if a viewport should force the Scrollables height to match its own

	if (getParent() instanceof JViewport) {
	    return (((JViewport)getParent()).getHeight() > getPreferredSize().height);
	}
	return false;
    
public booleangetScrollableTracksViewportWidth()
Returns true if a viewport should always force the width of this Scrollable to match the width of the viewport. For example a normal text view that supported line wrapping would return true here, since it would be undesirable for wrapped lines to disappear beyond the right edge of the viewport. Note that returning true for a Scrollable whose ancestor is a JScrollPane effectively disables horizontal scrolling.

Scrolling containers, like JViewport, will use this method each time they are validated.

return
true if a viewport should force the Scrollables width to match its own

	if (getParent() instanceof JViewport) {
	    return (((JViewport)getParent()).getWidth() > getPreferredSize().width);
	}
	return false;
    
public intgetScrollableUnitIncrement(java.awt.Rectangle visibleRect, int orientation, int direction)
Components that display logical rows or columns should compute the scroll increment that will completely expose one new row or column, depending on the value of orientation. Ideally, components should handle a partially exposed row or column by returning the distance required to completely expose the item.

The default implementation of this is to simply return 10% of the visible area. Subclasses are likely to be able to provide a much more reasonable value.

param
visibleRect the view area visible within the viewport
param
orientation either SwingConstants.VERTICAL or SwingConstants.HORIZONTAL
param
direction less than zero to scroll up/left, greater than zero for down/right
return
the "unit" increment for scrolling in the specified direction
exception
IllegalArgumentException for an invalid orientation
see
JScrollBar#setUnitIncrement

        switch(orientation) {
        case SwingConstants.VERTICAL:
            return visibleRect.height / 10;
        case SwingConstants.HORIZONTAL:
            return visibleRect.width / 10;
        default:
            throw new IllegalArgumentException("Invalid orientation: " + orientation);
        }
    
public java.lang.StringgetSelectedText()
Returns the selected text contained in this TextComponent. If the selection is null or the document empty, returns null.

return
the text
exception
IllegalArgumentException if the selection doesn't have a valid mapping into the document for some reason
see
#setText

        String txt = null;
        int p0 = Math.min(caret.getDot(), caret.getMark());
        int p1 = Math.max(caret.getDot(), caret.getMark());
        if (p0 != p1) {
            try {
                Document doc = getDocument();
                txt = doc.getText(p0, p1 - p0);
            } catch (BadLocationException e) {
		throw new IllegalArgumentException(e.getMessage());
            }
        }
        return txt;
    
public java.awt.ColorgetSelectedTextColor()
Fetches the current color used to render the selected text.

return
the color

        return selectedTextColor;
    
public java.awt.ColorgetSelectionColor()
Fetches the current color used to render the selection.

return
the color

        return selectionColor;
    
public intgetSelectionEnd()
Returns the selected text's end position. Return 0 if the document is empty, or the value of dot if there is no selection.

return
the end position >= 0

        int end = Math.max(caret.getDot(), caret.getMark());
        return end;
    
public intgetSelectionStart()
Returns the selected text's start position. Return 0 for an empty document, or the value of dot if no selection.

return
the start position >= 0

        int start = Math.min(caret.getDot(), caret.getMark());
        return start;
    
public java.lang.StringgetText(int offs, int len)
Fetches a portion of the text represented by the component. Returns an empty string if length is 0.

param
offs the offset >= 0
param
len the length >= 0
return
the text
exception
BadLocationException if the offset or length are invalid

        return getDocument().getText(offs, len);
    
public java.lang.StringgetText()
Returns the text contained in this TextComponent. If the underlying document is null, will give a NullPointerException. Note that text is not a bound property, so no PropertyChangeEvent is fired when it changes. To listen for changes to the text, use DocumentListener.

return
the text
exception
NullPointerException if the document is null
see
#setText

        Document doc = getDocument();
        String txt;
        try {
            txt = doc.getText(0, doc.getLength());
        } catch (BadLocationException e) {
            txt = null;
        }
        return txt;
    
public java.lang.StringgetToolTipText(java.awt.event.MouseEvent event)
Returns the string to be used as the tooltip for event. This will return one of:
  1. If setToolTipText has been invoked with a non-null value, it will be returned, otherwise
  2. The value from invoking getToolTipText on the UI will be returned.
By default JTextComponent does not register itself with the ToolTipManager. This means that tooltips will NOT be shown from the TextUI unless registerComponent has been invoked on the ToolTipManager.

param
event the event in question
return
the string to be used as the tooltip for event
see
javax.swing.JComponent#setToolTipText
see
javax.swing.plaf.TextUI#getToolTipText
see
javax.swing.ToolTipManager#registerComponent

        String retValue = super.getToolTipText(event);

        if (retValue == null) {
            TextUI ui = getUI();
            if (ui != null) {
                retValue = ui.getToolTipText(this, new Point(event.getX(),
                                                             event.getY()));
            }
        }
        return retValue;
    
public javax.swing.plaf.TextUIgetUI()
Fetches the user-interface factory for this text-oriented editor.

return
the factory

 return (TextUI)ui; 
private voidinstallDefaultTransferHandlerIfNecessary()
If the current TransferHandler is null, this will install a new one.

        if (getTransferHandler() == null) {
            if (defaultTransferHandler == null) {
                defaultTransferHandler = new DefaultTransferHandler();
            }
            setTransferHandler(defaultTransferHandler);
        }
    
private voidinvokeAction(java.lang.String name, javax.swing.Action altAction)
This is a conveniance method that is only useful for cut, copy and paste. If an Action with the name name does not exist in the ActionMap, this will attemp to install a TransferHandler and then use altAction.

        ActionMap map = getActionMap();
        Action action = null;

        if (map != null) {
            action = map.get(name);
        }
        if (action == null) {
            installDefaultTransferHandlerIfNecessary();
            action = altAction;
        }
        action.actionPerformed(new ActionEvent(this,
                               ActionEvent.ACTION_PERFORMED, (String)action.
                               getValue(Action.NAME),
                               EventQueue.getMostRecentEventTime(),
                               getCurrentEventModifiers()));
    
public booleanisEditable()
Returns the boolean indicating whether this TextComponent is editable or not.

return
the boolean value
see
#setEditable

        return editable;
    
private static java.lang.BooleanisProcessInputMethodEventOverridden(java.lang.Class klass)
Returns true if klass is NOT a JTextComponent and it or one of its superclasses (stoping at JTextComponent) overrides processInputMethodEvent. It is assumed this will be invoked from within a doPrivileged, and it is also assumed klass extends JTextComponent.

        if (klass == JTextComponent.class) {
            return Boolean.FALSE;
        }
        Boolean retValue = (Boolean)overrideMap.get(klass.getName());

        if (retValue != null) {
            return retValue;
        }
        Boolean sOverriden = isProcessInputMethodEventOverridden(
                                       klass.getSuperclass());

        if (sOverriden.booleanValue()) {
            // If our superclass has overriden it, then by definition klass
            // overrides it.
            overrideMap.put(klass.getName(), sOverriden);
            return sOverriden;
        }
        // klass's superclass didn't override it, check for an override in
        // klass.
        try {
            Class[] classes = new Class[1];
            classes[0] = InputMethodEvent.class;

            Method m = klass.getDeclaredMethod("processInputMethodEvent",
                                               classes);
            retValue = Boolean.TRUE;
        } catch (NoSuchMethodException nsme) {
            retValue = Boolean.FALSE;
        }
        overrideMap.put(klass.getName(), retValue);
        return retValue;
    
private booleanisProcessInputMethodEventOverridden()

        if (overrideMap == null) {
            overrideMap = Collections.synchronizedMap(new HashMap());
        }
        Boolean retValue = (Boolean)overrideMap.get(getClass().getName());

        if (retValue != null) {
            return retValue.booleanValue();
        }
	Boolean ret = (Boolean)AccessController.doPrivileged(new
                       PrivilegedAction() {
            public Object run() {
                return isProcessInputMethodEventOverridden(
                                JTextComponent.this.getClass());
            }
        });

	return ret.booleanValue();
    
public static voidloadKeymap(javax.swing.text.Keymap map, javax.swing.text.JTextComponent$KeyBinding[] bindings, javax.swing.Action[] actions)

Loads a keymap with a bunch of bindings. This can be used to take a static table of definitions and load them into some keymap. The following example illustrates an example of binding some keys to the cut, copy, and paste actions associated with a JTextComponent. A code fragment to accomplish this might look as follows:



static final JTextComponent.KeyBinding[] defaultBindings = {
new JTextComponent.KeyBinding(
KeyStroke.getKeyStroke(KeyEvent.VK_C, InputEvent.CTRL_MASK),
DefaultEditorKit.copyAction),
new JTextComponent.KeyBinding(
KeyStroke.getKeyStroke(KeyEvent.VK_V, InputEvent.CTRL_MASK),
DefaultEditorKit.pasteAction),
new JTextComponent.KeyBinding(
KeyStroke.getKeyStroke(KeyEvent.VK_X, InputEvent.CTRL_MASK),
DefaultEditorKit.cutAction),
};

JTextComponent c = new JTextPane();
Keymap k = c.getKeymap();
JTextComponent.loadKeymap(k, defaultBindings, c.getActions());

The sets of bindings and actions may be empty but must be non-null.

param
map the keymap
param
bindings the bindings
param
actions the set of actions

        Hashtable h = new Hashtable();
        for (int i = 0; i < actions.length; i++) {
            Action a = actions[i];
            String value = (String)a.getValue(Action.NAME);
            h.put((value!=null ? value:""), a);
        }
        for (int i = 0; i < bindings.length; i++) {
            Action a = (Action) h.get(bindings[i].actionName);
            if (a != null) {
                map.addActionForKeyStroke(bindings[i].key, a);
            }
        }
    
private voidmapCommittedTextToAction(java.lang.String committedText)

        Keymap binding = getKeymap();
        if (binding != null) {
            Action a = null;
            if (committedText.length() == 1) {
		KeyStroke k = KeyStroke.getKeyStroke(committedText.charAt(0));
                a = binding.getAction(k);
	    }

	    if (a == null) { 
	        a = binding.getDefaultAction();
	    }

            if (a != null) {
                ActionEvent ae =
                    new ActionEvent(this, ActionEvent.ACTION_PERFORMED, 
                                    committedText,
                                    EventQueue.getMostRecentEventTime(),
                                    getCurrentEventModifiers());
                a.actionPerformed(ae);
            }
        }
    
public java.awt.RectanglemodelToView(int pos)
Converts the given location in the model to a place in the view coordinate system. The component must have a positive size for this translation to be computed (i.e. layout cannot be computed until the component has been sized). The component does not have to be visible or painted.

param
pos the position >= 0
return
the coordinates as a rectangle, with (r.x, r.y) as the location in the coordinate system, or null if the component does not yet have a positive size.
exception
BadLocationException if the given position does not represent a valid location in the associated document
see
TextUI#modelToView

        return getUI().modelToView(this, pos);
    
public voidmoveCaretPosition(int pos)
Moves the caret to a new position, leaving behind a mark defined by the last time setCaretPosition was called. This forms a selection. If the document is null, does nothing. The position must be between 0 and the length of the component's text or else an exception is thrown.

param
pos the position
exception
IllegalArgumentException if the value supplied for position is less than zero or greater than the component's text length
see
#setCaretPosition

        Document doc = getDocument();
        if (doc != null) {
            if (pos > doc.getLength() || pos < 0) {
                throw new IllegalArgumentException("bad position: " + pos);
            }
            caret.moveDot(pos);
        }
    
protected java.lang.StringparamString()
Returns a string representation of this JTextComponent. This method is intended to be used only for debugging purposes, and the content and format of the returned string may vary between implementations. The returned string may be empty but may not be null.

Overriding paramString to provide information about the specific new aspects of the JFC components.

return
a string representation of this JTextComponent

        String editableString = (editable ?
				 "true" : "false");
        String caretColorString = (caretColor != null ?
				   caretColor.toString() : "");
        String selectionColorString = (selectionColor != null ?
				       selectionColor.toString() : "");
        String selectedTextColorString = (selectedTextColor != null ?
					  selectedTextColor.toString() : "");
        String disabledTextColorString = (disabledTextColor != null ?
					  disabledTextColor.toString() : "");
        String marginString = (margin != null ?
			       margin.toString() : "");

        return super.paramString() +
        ",caretColor=" + caretColorString +
        ",disabledTextColor=" + disabledTextColorString +
        ",editable=" + editableString +
        ",margin=" + marginString +
        ",selectedTextColor=" + selectedTextColorString +
        ",selectionColor=" + selectionColorString;
    
public voidpaste()
Transfers the contents of the system clipboard into the associated text model. If there is a selection in the associated view, it is replaced with the contents of the clipboard. If there is no selection, the clipboard contents are inserted in front of the current insert position in the associated view. If the clipboard is empty, does nothing.

see
#replaceSelection
see
java.awt.Toolkit#getSystemClipboard
see
java.awt.datatransfer.Clipboard

	if (isEditable() && isEnabled()) {
            invokeAction("paste", TransferHandler.getPasteAction());
	}
    
public booleanprint()
A convenience print method that displays a print dialog, and then prints this {@code JTextComponent} in interactive mode with no header or footer text. Note: this method blocks until printing is done.

Note: In headless mode, no dialogs will be shown.

This method calls the full featured {@link #print(MessageFormat, MessageFormat, boolean, PrintService, PrintRequestAttributeSet, boolean) print} method to perform printing.

return
{@code true}, unless printing is canceled by the user
throws
PrinterException if an error in the print system causes the job to be aborted
throws
SecurityException if this thread is not allowed to initiate a print job request
see
#print(MessageFormat, MessageFormat, boolean, PrintService, PrintRequestAttributeSet, boolean)
since
1.6

        return print(null, null, true, null, null, true);
    
public booleanprint(java.text.MessageFormat headerFormat, java.text.MessageFormat footerFormat)
A convenience print method that displays a print dialog, and then prints this {@code JTextComponent} in interactive mode with the specified header and footer text. Note: this method blocks until printing is done.

Note: In headless mode, no dialogs will be shown.

This method calls the full featured {@link #print(MessageFormat, MessageFormat, boolean, PrintService, PrintRequestAttributeSet, boolean) print} method to perform printing.

param
headerFormat the text, in {@code MessageFormat}, to be used as the header, or {@code null} for no header
param
footerFormat the text, in {@code MessageFormat}, to be used as the footer, or {@code null} for no footer
return
{@code true}, unless printing is canceled by the user
throws
PrinterException if an error in the print system causes the job to be aborted
throws
SecurityException if this thread is not allowed to initiate a print job request
see
#print(MessageFormat, MessageFormat, boolean, PrintService, PrintRequestAttributeSet, boolean)
see
java.text.MessageFormat
since
1.6

        return print(headerFormat, footerFormat, true, null, null, true);
    
public booleanprint(java.text.MessageFormat headerFormat, java.text.MessageFormat footerFormat, boolean showPrintDialog, javax.print.PrintService service, javax.print.attribute.PrintRequestAttributeSet attributes, boolean interactive)
Prints the content of this {@code JTextComponent}. Note: this method blocks until printing is done.

Page header and footer text can be added to the output by providing {@code MessageFormat} arguments. The printing code requests {@code Strings} from the formats, providing a single item which may be included in the formatted string: an {@code Integer} representing the current page number.

{@code showPrintDialog boolean} parameter allows you to specify whether a print dialog is displayed to the user. When it is, the user may use the dialog to change printing attributes or even cancel the print.

{@code service} allows you to provide the initial {@code PrintService} for the print dialog, or to specify {@code PrintService} to print to when the dialog is not shown.

{@code attributes} can be used to provide the initial values for the print dialog, or to supply any needed attributes when the dialog is not shown. {@code attributes} can be used to control how the job will print, for example duplex or single-sided.

{@code interactive boolean} parameter allows you to specify whether to perform printing in interactive mode. If {@code true}, a progress dialog, with an abort option, is displayed for the duration of printing. This dialog is modal when {@code print} is invoked on the Event Dispatch Thread and non-modal otherwise. Warning: calling this method on the Event Dispatch Thread with {@code interactive false} blocks all events, including repaints, from being processed until printing is complete. It is only recommended when printing from an application with no visible GUI.

Note: In headless mode, {@code showPrintDialog} and {@code interactive} parameters are ignored and no dialogs are shown.

This method ensures the {@code document} is not mutated during printing. To indicate it visually, {@code setEnabled(false)} is set for the duration of printing.

This method uses {@link #getPrintable} to render document content.

This method is thread-safe, although most Swing methods are not. Please see How to Use Threads for more information.

Sample Usage. This code snippet shows a cross-platform print dialog and then prints the {@code JTextComponent} in interactive mode unless the user cancels the dialog:

textComponent.print(new MessageFormat("My text component header"),
new MessageFormat("Footer. Page - {0}"), true, null, null, true);

Executing this code off the Event Dispatch Thread performs printing on the background. The following pattern might be used for background printing:

FutureTask<Boolean> future =
new FutureTask<Boolean>(
new Callable<Boolean>() {
public Boolean call() {
return textComponent.print(.....);
}
});
executor.execute(future);

param
headerFormat the text, in {@code MessageFormat}, to be used as the header, or {@code null} for no header
param
footerFormat the text, in {@code MessageFormat}, to be used as the footer, or {@code null} for no footer
param
showPrintDialog {@code true} to display a print dialog, {@code false} otherwise
param
service initial {@code PrintService}, or {@code null} for the default
param
attributes the job attributes to be applied to the print job, or {@code null} for none
param
interactive whether to print in an interactive mode
return
{@code true}, unless printing is canceled by the user
throws
PrinterException if an error in the print system causes the job to be aborted
throws
SecurityException if this thread is not allowed to initiate a print job request
see
#getPrintable
see
java.text.MessageFormat
see
java.awt.GraphicsEnvironment#isHeadless
see
java.util.concurrent.FutureTask
since
1.6


        final PrinterJob job = PrinterJob.getPrinterJob();
        final Printable printable;
        final PrintingStatus printingStatus;
        final boolean isHeadless = GraphicsEnvironment.isHeadless();
        final boolean isEventDispatchThread = 
            SwingUtilities.isEventDispatchThread();
        final Printable textPrintable = getPrintable(headerFormat, footerFormat);
        if (interactive && ! isHeadless) {
            printingStatus = 
                PrintingStatus.createPrintingStatus(this, job);
            printable = 
                printingStatus.createNotificationPrintable(textPrintable);
        } else {
            printingStatus = null; 
            printable = textPrintable;
        }

        if (service != null) {
            job.setPrintService(service);
        }

        job.setPrintable(printable);

        final PrintRequestAttributeSet attr = (attributes == null) 
            ? new HashPrintRequestAttributeSet() 
            : attributes;        

        if (showPrintDialog && ! isHeadless && ! job.printDialog(attr)) {
            return false;
        }

        /*
         * there are three cases for printing:
         * 1. print non interactively (! interactive || isHeadless)
         * 2. print interactively off EDT
         * 3. print interactively on EDT
         * 
         * 1 and 2 prints on the current thread (3 prints on another thread)
         * 2 and 3 deal with PrintingStatusDialog
         */
        final Callable<Object> doPrint = 
            new Callable<Object>() {
                public Object call() throws Exception {
                    try {
                        job.print(attr);
                    } finally {
                        if (printingStatus != null) {
                            printingStatus.dispose();
                        }
                    }
                    return null;
                }
            };

        final FutureTask<Object> futurePrinting = 
            new FutureTask<Object>(doPrint);

        final Runnable runnablePrinting = 
            new Runnable() {
                public void run() {
                    //disable component
                    boolean wasEnabled = false;
                    if (isEventDispatchThread) {
                        if (isEnabled()) {
                            wasEnabled = true;
                            setEnabled(false);
                        }
                    } else {
                        try {
                            wasEnabled = SwingUtilities2.submit(
                                new Callable<Boolean>() {
                                    public Boolean call() throws Exception {
                                        boolean rv = isEnabled();
                                        if (rv) {
                                            setEnabled(false);
                                        } 
                                        return rv;
                                    }
                                }).get();
                        } catch (InterruptedException e) {
                            throw new RuntimeException(e);
                        } catch (ExecutionException e) {
                            Throwable cause = e.getCause();
                            if (cause instanceof Error) {
                                throw (Error) cause;
                            } 
                            if (cause instanceof RuntimeException) {
                                throw (RuntimeException) cause;
                            } 
                            throw new AssertionError(cause);
                        }
                    }

                    getDocument().render(futurePrinting);

                    //enable component
                    if (wasEnabled) {
                        if (isEventDispatchThread) {
                            setEnabled(true);
                        } else {
                            try {
                                SwingUtilities2.submit(
                                    new Runnable() {
                                        public void run() {
                                            setEnabled(true);
                                        }
                                    }, null).get();
                            } catch (InterruptedException e) {
                                throw new RuntimeException(e);
                            } catch (ExecutionException e) {
                                Throwable cause = e.getCause();
                                if (cause instanceof Error) {
                                    throw (Error) cause;
                                } 
                                if (cause instanceof RuntimeException) {
                                    throw (RuntimeException) cause;
                                } 
                                throw new AssertionError(cause);
                            }
                        }
                    }
                }
            };
        
        if (! interactive || isHeadless) {
            runnablePrinting.run();
        } else {
            if (isEventDispatchThread) {
                (new Thread(runnablePrinting)).start();
                printingStatus.showModal(true);
            } else {
                printingStatus.showModal(false);
                runnablePrinting.run();
            }
        }
        
        //the printing is done successfully or otherwise. 
        //dialog is hidden if needed.
        try {
            futurePrinting.get();
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        } catch (ExecutionException e) {
            Throwable cause = e.getCause();
            if (cause instanceof PrinterAbortException) {
                if (printingStatus != null
                    && printingStatus.isAborted()) {
                    return false;
                } else {
                    throw (PrinterAbortException) cause;
                }
            } else if (cause instanceof PrinterException) {
                throw (PrinterException) cause;
            } else if (cause instanceof RuntimeException) {
                throw (RuntimeException) cause;
            } else if (cause instanceof Error) {
                throw (Error) cause;
            } else {
                throw new AssertionError(cause);
            }
        }
        return true;
    
protected voidprocessInputMethodEvent(java.awt.event.InputMethodEvent e)

	// let listeners handle the events
	super.processInputMethodEvent(e);

	if (!e.isConsumed()) {
            if (! isEditable()) {
                return;
            } else {
  	        switch (e.getID()) {
		case InputMethodEvent.INPUT_METHOD_TEXT_CHANGED:
		    replaceInputMethodText(e);

		    // fall through

		case InputMethodEvent.CARET_POSITION_CHANGED:
		    setInputMethodCaretPosition(e);
		    break;
		}
	    }

	    e.consume();
	}
    
public voidread(java.io.Reader in, java.lang.Object desc)
Initializes from a stream. This creates a model of the type appropriate for the component and initializes the model from the stream. By default this will load the model as plain text. Previous contents of the model are discarded.

param
in the stream to read from
param
desc an object describing the stream; this might be a string, a File, a URL, etc. Some kinds of documents (such as html for example) might be able to make use of this information; if non-null, it is added as a property of the document
exception
IOException as thrown by the stream being used to initialize
see
EditorKit#createDefaultDocument
see
#setDocument
see
PlainDocument

        EditorKit kit = getUI().getEditorKit(this);
        Document doc = kit.createDefaultDocument();
        if (desc != null) {
            doc.putProperty(Document.StreamDescriptionProperty, desc);
        }
        try {
            kit.read(in, doc, 0);
            setDocument(doc);
        } catch (BadLocationException e) {
            throw new IOException(e.getMessage());
        }
    
private voidreadObject(java.io.ObjectInputStream s)

        s.defaultReadObject();
        caretEvent = new MutableCaretEvent(this);
        addMouseListener(caretEvent);
        addFocusListener(caretEvent);
    
public voidremoveCaretListener(javax.swing.event.CaretListener listener)
Removes a caret listener.

param
listener the listener to be removed
see
javax.swing.event.CaretEvent

        listenerList.remove(CaretListener.class, listener);
    
public static javax.swing.text.KeymapremoveKeymap(java.lang.String nm)
Removes a named keymap previously added to the document. Keymaps with null names may not be removed in this way.

param
nm the name of the keymap to remove
return
the keymap that was removed

        return getKeymapTable().remove(nm);
    
public voidremoveNotify()

        super.removeNotify();
        if (getFocusedComponent() == this) {
            AppContext.getAppContext().remove(FOCUSED_COMPONENT);
        }
    
private voidreplaceInputMethodText(java.awt.event.InputMethodEvent e)

    	int commitCount = e.getCommittedCharacterCount();
	AttributedCharacterIterator text = e.getText();
	int composedTextIndex;

	// old composed text deletion
	Document doc = getDocument();
	if (composedTextExists()) {
	    try {	
	        doc.remove(composedTextStart.getOffset(), 
                           composedTextEnd.getOffset() - 
                           composedTextStart.getOffset());
	    } catch (BadLocationException ble) {}
	    composedTextStart = composedTextEnd = null;
	    composedTextAttribute = null;
	    composedTextContent = null;
	}
	
	if (text != null) {
	    text.first();
	    int committedTextStartIndex = 0;
	    int committedTextEndIndex = 0;

	    // committed text insertion
	    if (commitCount > 0) {
		// Remember latest committed text start index
		committedTextStartIndex = caret.getDot();

		// Need to generate KeyTyped events for the committed text for components
		// that are not aware they are active input method clients.
		if (shouldSynthensizeKeyEvents()) {
		    for (char c = text.current(); commitCount > 0; 
		         c = text.next(), commitCount--) {
			KeyEvent ke = new KeyEvent(this, KeyEvent.KEY_TYPED, 
						   EventQueue.getMostRecentEventTime(),
						   0, KeyEvent.VK_UNDEFINED, c);
			processKeyEvent(ke);
		    }
		} else {
		    StringBuffer strBuf = new StringBuffer();
		    for (char c = text.current(); commitCount > 0; 
		         c = text.next(), commitCount--) {
			strBuf.append(c);
		    }
		
		    // map it to an ActionEvent
		    mapCommittedTextToAction(new String(strBuf));
		}
		
		// Remember latest committed text end index 
		committedTextEndIndex = caret.getDot();
	    }

	    // new composed text insertion
	    composedTextIndex = text.getIndex();
	    if (composedTextIndex < text.getEndIndex()) {
		createComposedTextAttribute(composedTextIndex, text);
		try {	
		    replaceSelection(null);
		    doc.insertString(caret.getDot(), composedTextContent, 
		    			composedTextAttribute);
		    composedTextStart = doc.createPosition(caret.getDot() -
						composedTextContent.length());
                    composedTextEnd = doc.createPosition(caret.getDot());
		} catch (BadLocationException ble) {
	            composedTextStart = composedTextEnd = null;
	            composedTextAttribute = null;
	            composedTextContent = null;
		}	
	    }

	    // Save the latest committed text information
	    if (committedTextStartIndex != committedTextEndIndex) {
		try {	
		    latestCommittedTextStart = doc.
                        createPosition(committedTextStartIndex);
                    latestCommittedTextEnd = doc.
                        createPosition(committedTextEndIndex);
		} catch (BadLocationException ble) {
		    latestCommittedTextStart = 
                        latestCommittedTextEnd = null;
		}
	    } else {
		latestCommittedTextStart = 
                    latestCommittedTextEnd = null;
	    }
	}
    
public voidreplaceSelection(java.lang.String content)
Replaces the currently selected content with new content represented by the given string. If there is no selection this amounts to an insert of the given text. If there is no replacement text this amounts to a removal of the current selection.

This is the method that is used by the default implementation of the action for inserting content that gets bound to the keymap actions.

This method is thread safe, although most Swing methods are not. Please see How to Use Threads for more information.

param
content the content to replace the selection with

        Document doc = getDocument();
        if (doc != null) {
            try {
		boolean composedTextSaved = saveComposedText(caret.getDot());
                int p0 = Math.min(caret.getDot(), caret.getMark());
                int p1 = Math.max(caret.getDot(), caret.getMark());
                if (doc instanceof AbstractDocument) {
                    ((AbstractDocument)doc).replace(p0, p1 - p0, content,null);
                }
                else {
                    if (p0 != p1) {
                        doc.remove(p0, p1 - p0);
                    }
                    if (content != null && content.length() > 0) {
                        doc.insertString(p0, content, null);
                    }
                }
		if (composedTextSaved) {
		    restoreComposedText();
		}
            } catch (BadLocationException e) {
		UIManager.getLookAndFeel().provideErrorFeedback(JTextComponent.this);
            }
        }
    
private voidrestoreComposedText()

	Document doc = getDocument();
	try {
	    doc.insertString(caret.getDot(),
                             composedTextContent, 
		    	     composedTextAttribute);
	    composedTextStart = doc.createPosition(caret.getDot() - 
				composedTextContent.length());
            composedTextEnd = doc.createPosition(caret.getDot());
	} catch (BadLocationException ble) {}
    
private booleansaveComposedText(int pos)

	if (composedTextExists()) {
	    int start = composedTextStart.getOffset();
	    int len = composedTextEnd.getOffset() - 
                composedTextStart.getOffset();
	    if (pos >= start && pos <= start + len) {
		try {	
		    getDocument().remove(start, len);
		    return true;
		} catch (BadLocationException ble) {}
	    }
	}
	return false;
    
public voidselect(int selectionStart, int selectionEnd)
Selects the text between the specified start and end positions.

This method sets the start and end positions of the selected text, enforcing the restriction that the start position must be greater than or equal to zero. The end position must be greater than or equal to the start position, and less than or equal to the length of the text component's text.

If the caller supplies values that are inconsistent or out of bounds, the method enforces these constraints silently, and without failure. Specifically, if the start position or end position is greater than the length of the text, it is reset to equal the text length. If the start position is less than zero, it is reset to zero, and if the end position is less than the start position, it is reset to the start position.

This call is provided for backward compatibility. It is routed to a call to setCaretPosition followed by a call to moveCaretPosition. The preferred way to manage selection is by calling those methods directly.

param
selectionStart the start position of the text
param
selectionEnd the end position of the text
see
#setCaretPosition
see
#moveCaretPosition

	// argument adjustment done by java.awt.TextComponent
        int docLength = getDocument().getLength();
        
	if (selectionStart < 0) {
	    selectionStart = 0;
	}
        if (selectionStart > docLength) {
            selectionStart = docLength;
        }
        if (selectionEnd > docLength) {
            selectionEnd = docLength;
	}
	if (selectionEnd < selectionStart) {
	    selectionEnd = selectionStart;
	}

        setCaretPosition(selectionStart);
        moveCaretPosition(selectionEnd);
    
public voidselectAll()
Selects all the text in the TextComponent. Does nothing on a null or empty document.

        Document doc = getDocument();
        if (doc != null) {
            setCaretPosition(0);
            moveCaretPosition(doc.getLength());
        }
    
public voidsetCaret(javax.swing.text.Caret c)
Sets the caret to be used. By default this will be set by the UI that gets installed. This can be changed to a custom caret if desired. Setting the caret results in a PropertyChange event ("caret") being fired.

param
c the caret
see
#getCaret
beaninfo
description: the caret used to select/navigate bound: true expert: true

        if (caret != null) {
            caret.removeChangeListener(caretEvent);
            caret.deinstall(this);
        }
        Caret old = caret;
        caret = c;
        if (caret != null) {
            caret.install(this);
            caret.addChangeListener(caretEvent);
        }
        firePropertyChange("caret", old, caret);
    
public voidsetCaretColor(java.awt.Color c)
Sets the current color used to render the caret. Setting to null effectively restores the default color. Setting the color results in a PropertyChange event ("caretColor") being fired.

param
c the color
see
#getCaretColor
beaninfo
description: the color used to render the caret bound: true preferred: true

        Color old = caretColor;
        caretColor = c;
        firePropertyChange("caretColor", old, caretColor);
    
public voidsetCaretPosition(int position)
Sets the position of the text insertion caret for the TextComponent. Note that the caret tracks change, so this may move if the underlying text of the component is changed. If the document is null, does nothing. The position must be between 0 and the length of the component's text or else an exception is thrown.

param
position the position
exception
IllegalArgumentException if the value supplied for position is less than zero or greater than the component's text length
beaninfo
description: the caret position

        Document doc = getDocument();
        if (doc != null) {
	    if (position > doc.getLength() || position < 0) {
		throw new IllegalArgumentException("bad position: " + position);
	    }
            caret.setDot(position);
        }
    
public voidsetComponentOrientation(java.awt.ComponentOrientation o)

        // Set the document's run direction property to match the
        // ComponentOrientation property.
        Document doc = getDocument();
        if( doc !=  null ) {
            Boolean runDir = o.isLeftToRight() 
                             ? TextAttribute.RUN_DIRECTION_LTR
                             : TextAttribute.RUN_DIRECTION_RTL;
            doc.putProperty( TextAttribute.RUN_DIRECTION, runDir );
        }
        super.setComponentOrientation( o );
    
public voidsetDisabledTextColor(java.awt.Color c)
Sets the current color used to render the disabled text. Setting the color fires off a PropertyChange event ("disabledTextColor").

param
c the color
see
#getDisabledTextColor
beaninfo
description: color used to render disabled text bound: true preferred: true

        Color old = disabledTextColor;
        disabledTextColor = c;
        firePropertyChange("disabledTextColor", old, disabledTextColor);
    
public voidsetDocument(javax.swing.text.Document doc)
Associates the editor with a text document. The currently registered factory is used to build a view for the document, which gets displayed by the editor after revalidation. A PropertyChange event ("document") is propagated to each listener.

param
doc the document to display/edit
see
#getDocument
beaninfo
description: the text document model bound: true expert: true

        Document old = model;

	/*
	 * aquire a read lock on the old model to prevent notification of
	 * mutations while we disconnecting the old model.
	 */
	try {
	    if (old instanceof AbstractDocument) {
		((AbstractDocument)old).readLock();
	    }
	    if (accessibleContext != null) {
		model.removeDocumentListener(
		    ((AccessibleJTextComponent)accessibleContext));
	    }
	    if (inputMethodRequestsHandler != null) {
		model.removeDocumentListener((DocumentListener)inputMethodRequestsHandler);
	    }
	    model = doc;

            // Set the document's run direction property to match the
            // component's ComponentOrientation property.
            Boolean runDir = getComponentOrientation().isLeftToRight() 
                             ? TextAttribute.RUN_DIRECTION_LTR
                             : TextAttribute.RUN_DIRECTION_RTL;
            if (runDir != doc.getProperty(TextAttribute.RUN_DIRECTION)) {
                doc.putProperty(TextAttribute.RUN_DIRECTION, runDir );
            }
	    firePropertyChange("document", old, doc);
	} finally {
	    if (old instanceof AbstractDocument) {
		((AbstractDocument)old).readUnlock();
	    }
	}

        revalidate();
        repaint();
        if (accessibleContext != null) {
            model.addDocumentListener(
                ((AccessibleJTextComponent)accessibleContext));
        }
	if (inputMethodRequestsHandler != null) {
            model.addDocumentListener((DocumentListener)inputMethodRequestsHandler);
        }
    
public voidsetDragEnabled(boolean b)
Turns on or off automatic drag handling. In order to enable automatic drag handling, this property should be set to {@code true}, and the component's {@code TransferHandler} needs to be {@code non-null}. The default value of the {@code dragEnabled} property is {@code false}.

The job of honoring this property, and recognizing a user drag gesture, lies with the look and feel implementation, and in particular, the component's {@code TextUI}. When automatic drag handling is enabled, most look and feels (including those that subclass {@code BasicLookAndFeel}) begin a drag and drop operation whenever the user presses the mouse button over a selection and then moves the mouse a few pixels. Setting this property to {@code true} can therefore have a subtle effect on how selections behave.

If a look and feel is used that ignores this property, you can still begin a drag and drop operation by calling {@code exportAsDrag} on the component's {@code TransferHandler}.

param
b whether or not to enable automatic drag handling
exception
HeadlessException if b is true and GraphicsEnvironment.isHeadless() returns true
see
java.awt.GraphicsEnvironment#isHeadless
see
#getDragEnabled
see
#setTransferHandler
see
TransferHandler
since
1.4
beaninfo
description: determines whether automatic drag handling is enabled bound: false

        if (b && GraphicsEnvironment.isHeadless()) {
            throw new HeadlessException();
        }
	dragEnabled = b;
    
java.lang.ObjectsetDropLocation(javax.swing.TransferHandler$DropLocation location, java.lang.Object state, boolean forDrop)
Called to set or clear the drop location during a DnD operation. In some cases, the component may need to use it's internal selection temporarily to indicate the drop location. To help facilitate this, this method returns and accepts as a parameter a state object. This state object can be used to store, and later restore, the selection state. Whatever this method returns will be passed back to it in future calls, as the state parameter. If it wants the DnD system to continue storing the same state, it must pass it back every time. Here's how this is used:

Let's say that on the first call to this method the component decides to save some state (because it is about to use the selection to show a drop index). It can return a state object to the caller encapsulating any saved selection state. On a second call, let's say the drop location is being changed to something else. The component doesn't need to restore anything yet, so it simply passes back the same state object to have the DnD system continue storing it. Finally, let's say this method is messaged with null. This means DnD is finished with this component for now, meaning it should restore state. At this point, it can use the state parameter to restore said state, and of course return null since there's no longer anything to store.

Note: This method is meant to override JComponent.setDropLocation(), which is package-private in javax.swing. TransferHandler will detect text components and call this method instead via reflection. It's name should therefore not be changed.

param
location the drop location (as calculated by dropLocationForPoint) or null if there's no longer a valid drop location
param
state the state object saved earlier for this component, or null
param
forDrop whether or not the method is being called because an actual drop occurred
return
any saved state for this component, or null if none


        Object retVal = null;
        DropLocation textLocation = (DropLocation)location;

        if (dropMode == DropMode.USE_SELECTION) {
            if (textLocation == null) {
                if (state != null) {
                    /*
                     * This object represents the state saved earlier.
                     *     If the caret is a DefaultCaret it will be
                     *     an Object array containing, in order:
                     *         - the saved caret mark (Integer)
                     *         - the saved caret dot (Integer)
                     *         - the saved caret visibility (Boolean)
                     *         - the saved mark bias (Position.Bias)
                     *         - the saved dot bias (Position.Bias)
                     *     If the caret is not a DefaultCaret it will
                     *     be similar, but will not contain the dot
                     *     or mark bias.
                     */
                    Object[] vals = (Object[])state;

                    if (!forDrop) {
                        if (caret instanceof DefaultCaret) {
                            ((DefaultCaret)caret).setDot(((Integer)vals[0]).intValue(),
                                                         (Position.Bias)vals[3]);
                            ((DefaultCaret)caret).moveDot(((Integer)vals[1]).intValue(),
                                                         (Position.Bias)vals[4]);
                        } else {
                            caret.setDot(((Integer)vals[0]).intValue());
                            caret.moveDot(((Integer)vals[1]).intValue());
                        }
                    }

                    caret.setVisible(((Boolean)vals[2]).booleanValue());
                }
            } else {
                if (dropLocation == null) {
                    boolean visible;

                    if (caret instanceof DefaultCaret) {
                        DefaultCaret dc = (DefaultCaret)caret;
                        visible = dc.isActive();
                        retVal = new Object[] {Integer.valueOf(dc.getMark()),
                                               Integer.valueOf(dc.getDot()),
                                               Boolean.valueOf(visible),
                                               dc.getMarkBias(),
                                               dc.getDotBias()};
                    } else {
                        visible = caret.isVisible();
                        retVal = new Object[] {Integer.valueOf(caret.getMark()),
                                               Integer.valueOf(caret.getDot()),
                                               Boolean.valueOf(visible)};
                    }

                    caret.setVisible(true);
                } else {
                    retVal = state;
                }

                if (caret instanceof DefaultCaret) {
                    ((DefaultCaret)caret).setDot(textLocation.getIndex(), textLocation.getBias());
                } else {
                    caret.setDot(textLocation.getIndex());
                }
            }
        } else {
            if (textLocation == null) {
                if (state != null) {
                    caret.setVisible(((Boolean)state).booleanValue());
                }
            } else {
                if (dropLocation == null) {
                    boolean visible = caret instanceof DefaultCaret
                                      ? ((DefaultCaret)caret).isActive()
                                      : caret.isVisible();
                    retVal = Boolean.valueOf(visible);
                    caret.setVisible(false);
                } else {
                    retVal = state;
                }
            }
        }

        DropLocation old = dropLocation;
        dropLocation = textLocation;
        firePropertyChange("dropLocation", old, dropLocation);

        return retVal;
    
public final voidsetDropMode(javax.swing.DropMode dropMode)
Sets the drop mode for this component. For backward compatibility, the default for this property is DropMode.USE_SELECTION. Usage of DropMode.INSERT is recommended, however, for an improved user experience. It offers similar behavior of dropping between text locations, but does so without affecting the actual text selection and caret location.

JTextComponents support the following drop modes:

  • DropMode.USE_SELECTION
  • DropMode.INSERT

The drop mode is only meaningful if this component has a TransferHandler that accepts drops.

param
dropMode the drop mode to use
throws
IllegalArgumentException if the drop mode is unsupported or null
see
#getDropMode
see
#getDropLocation
see
#setTransferHandler
see
javax.swing.TransferHandler
since
1.6

        if (dropMode != null) {
            switch (dropMode) {
                case USE_SELECTION:
                case INSERT:
                    this.dropMode = dropMode;
                    return;
            }
        }

        throw new IllegalArgumentException(dropMode + ": Unsupported drop mode for text");
    
public voidsetEditable(boolean b)
Sets the specified boolean to indicate whether or not this TextComponent should be editable. A PropertyChange event ("editable") is fired when the state is changed.

param
b the boolean to be set
see
#isEditable
beaninfo
description: specifies if the text can be edited bound: true

	if (b != editable) {
	    boolean oldVal = editable;
	    editable = b;
	    enableInputMethods(editable);
	    firePropertyChange("editable", Boolean.valueOf(oldVal), Boolean.valueOf(editable));
	    repaint();
	}
    
public voidsetFocusAccelerator(char aKey)
Sets the key accelerator that will cause the receiving text component to get the focus. The accelerator will be the key combination of the alt key and the character given (converted to upper case). By default, there is no focus accelerator key. Any previous key accelerator setting will be superseded. A '\0' key setting will be registered, and has the effect of turning off the focus accelerator. When the new key is set, a PropertyChange event (FOCUS_ACCELERATOR_KEY) will be fired.

param
aKey the key
see
#getFocusAccelerator
beaninfo
description: accelerator character used to grab focus bound: true


                                                                                                                       
        
        aKey = Character.toUpperCase(aKey);
        char old = focusAccelerator;
        focusAccelerator = aKey;
        // Fix for 4341002: value of FOCUS_ACCELERATOR_KEY is wrong.
        // So we fire both FOCUS_ACCELERATOR_KEY, for compatibility,
        // and the correct event here.
        firePropertyChange(FOCUS_ACCELERATOR_KEY, old, focusAccelerator);
        firePropertyChange("focusAccelerator", old, focusAccelerator);
    
public voidsetHighlighter(javax.swing.text.Highlighter h)
Sets the highlighter to be used. By default this will be set by the UI that gets installed. This can be changed to a custom highlighter if desired. The highlighter can be set to null to disable it. A PropertyChange event ("highlighter") is fired when a new highlighter is installed.

param
h the highlighter
see
#getHighlighter
beaninfo
description: object responsible for background highlights bound: true expert: true

        if (highlighter != null) {
            highlighter.deinstall(this);
        }
        Highlighter old = highlighter;
        highlighter = h;
        if (highlighter != null) {
            highlighter.install(this);
        }
        firePropertyChange("highlighter", old, h);
    
private voidsetInputMethodCaretPosition(java.awt.event.InputMethodEvent e)

	int dot;
	
	if (composedTextExists()) {
	    dot = composedTextStart.getOffset();
	    if (!(caret instanceof ComposedTextCaret)) {
		if (composedTextCaret == null) {
		    composedTextCaret = new ComposedTextCaret();
		}
		originalCaret = caret;	
		// Sets composed text caret
	        exchangeCaret(originalCaret, composedTextCaret);
	    }

	    TextHitInfo caretPos = e.getCaret();
	    if (caretPos != null) {
		int index = caretPos.getInsertionIndex();
		dot += index;
		if (index == 0) {
		    // Scroll the component if needed so that the composed text
		    // becomes visible.
		    try {
			Rectangle d = modelToView(dot);
			Rectangle end = modelToView(composedTextEnd.getOffset());
			Rectangle b = getBounds(); 
			d.x += Math.min(end.x - d.x, b.width);
			scrollRectToVisible(d);
		    } catch (BadLocationException ble) {}
		}
	    }
	    caret.setDot(dot);
	} else if (caret instanceof ComposedTextCaret) {
	    dot = caret.getDot();
	    // Restores original caret
	    exchangeCaret(caret, originalCaret);
	    caret.setDot(dot);
	}
    
public voidsetKeymap(javax.swing.text.Keymap map)
Sets the keymap to use for binding events to actions. Setting to null effectively disables keyboard input. A PropertyChange event ("keymap") is fired when a new keymap is installed.

param
map the keymap
see
#getKeymap
beaninfo
description: set of key event to action bindings to use bound: true

        Keymap old = keymap;
        keymap = map;
        firePropertyChange("keymap", old, keymap);
	updateInputMap(old, map);
    
public voidsetMargin(java.awt.Insets m)
Sets margin space between the text component's border and its text. The text component's default Border object will use this value to create the proper margin. However, if a non-default border is set on the text component, it is that Border object's responsibility to create the appropriate margin space (else this property will effectively be ignored). This causes a redraw of the component. A PropertyChange event ("margin") is sent to all listeners.

param
m the space between the border and the text
beaninfo
description: desired space between the border and text area bound: true

        Insets old = margin;
        margin = m;
        firePropertyChange("margin", old, m);
        invalidate();
    
public voidsetNavigationFilter(javax.swing.text.NavigationFilter filter)
Sets the NavigationFilter. NavigationFilter is used by DefaultCaret and the default cursor movement actions as a way to restrict the cursor movement.

since
1.4

        navigationFilter = filter;
    
public voidsetSelectedTextColor(java.awt.Color c)
Sets the current color used to render the selected text. Setting the color to null is the same as Color.black. Setting the color results in a PropertyChange event ("selectedTextColor") being fired.

param
c the color
see
#getSelectedTextColor
beaninfo
description: color used to render selected text bound: true preferred: true

        Color old = selectedTextColor;
        selectedTextColor = c;
        firePropertyChange("selectedTextColor", old, selectedTextColor);
    
public voidsetSelectionColor(java.awt.Color c)
Sets the current color used to render the selection. Setting the color to null is the same as setting Color.white. Setting the color results in a PropertyChange event ("selectionColor").

param
c the color
see
#getSelectionColor
beaninfo
description: color used to render selection background bound: true preferred: true

        Color old = selectionColor;
        selectionColor = c;
        firePropertyChange("selectionColor", old, selectionColor);
    
public voidsetSelectionEnd(int selectionEnd)
Sets the selection end to the specified position. The new end point is constrained to be at or after the current selection start.

This is available for backward compatibility to code that called this method on java.awt.TextComponent. This is implemented to forward to the Caret implementation which is where the actual selection is maintained.

param
selectionEnd the end position of the text >= 0
beaninfo
description: ending location of the selection.

        /* Route through select method to enforce consistent policy
         * between selectionStart and selectionEnd.
         */
        select(getSelectionStart(), selectionEnd);
    
public voidsetSelectionStart(int selectionStart)
Sets the selection start to the specified position. The new starting point is constrained to be before or at the current selection end.

This is available for backward compatibility to code that called this method on java.awt.TextComponent. This is implemented to forward to the Caret implementation which is where the actual selection is maintained.

param
selectionStart the start position of the text >= 0
beaninfo
description: starting location of the selection.

        /* Route through select method to enforce consistent policy
         * between selectionStart and selectionEnd.
         */
        select(selectionStart, getSelectionEnd());
    
public voidsetText(java.lang.String t)
Sets the text of this TextComponent to the specified text. If the text is null or empty, has the effect of simply deleting the old text. When text has been inserted, the resulting caret location is determined by the implementation of the caret class.

This method is thread safe, although most Swing methods are not. Please see How to Use Threads for more information. Note that text is not a bound property, so no PropertyChangeEvent is fired when it changes. To listen for changes to the text, use DocumentListener.

param
t the new text to be set
see
#getText
see
DefaultCaret
beaninfo
description: the text of this component

        try {
            Document doc = getDocument();
            if (doc instanceof AbstractDocument) {
                ((AbstractDocument)doc).replace(0, doc.getLength(), t,null);
            }
            else {
                doc.remove(0, doc.getLength());
                doc.insertString(0, t, null);
            }
        } catch (BadLocationException e) {
	    UIManager.getLookAndFeel().provideErrorFeedback(JTextComponent.this);
        }
    
public voidsetUI(javax.swing.plaf.TextUI ui)
Sets the user-interface factory for this text-oriented editor.

param
ui the factory

        super.setUI(ui);
    
private booleanshouldSynthensizeKeyEvents()
Returns true if KeyEvents should be synthesized from an InputEvent.

        if (!checkedInputOverride) {
            checkedInputOverride = true;
            needToSendKeyTypedEvent =
                             !isProcessInputMethodEventOverridden();
        }
        return needToSendKeyTypedEvent;
    
voidupdateInputMap(javax.swing.text.Keymap oldKm, javax.swing.text.Keymap newKm)
Updates the InputMaps in response to a Keymap change.

param
oldKm the old Keymap
param
newKm the new Keymap

	// Locate the current KeymapWrapper.
	InputMap km = getInputMap(JComponent.WHEN_FOCUSED);
	InputMap last = km;
	while (km != null && !(km instanceof KeymapWrapper)) {
	    last = km;
	    km = km.getParent();
	}
	if (km != null) {
	    // Found it, tweak the InputMap that points to it, as well
	    // as anything it points to.
	    if (newKm == null) {
		if (last != km) {
		    last.setParent(km.getParent());
		}
		else {
		    last.setParent(null);
		}
	    }
	    else {
		InputMap newKM = new KeymapWrapper(newKm);
		last.setParent(newKM);
		if (last != km) {
		    newKM.setParent(km.getParent());
		}
	    }
	}
	else if (newKm != null) {
	    km = getInputMap(JComponent.WHEN_FOCUSED);
	    if (km != null) {
		// Couldn't find it.
		// Set the parent of WHEN_FOCUSED InputMap to be the new one.
		InputMap newKM = new KeymapWrapper(newKm);
		newKM.setParent(km.getParent());
		km.setParent(newKM);
	    }
	}

	// Do the same thing with the ActionMap
	ActionMap am = getActionMap();
	ActionMap lastAM = am;
	while (am != null && !(am instanceof KeymapActionMap)) {
	    lastAM = am;
	    am = am.getParent();
	}
	if (am != null) {
	    // Found it, tweak the Actionap that points to it, as well
	    // as anything it points to.
	    if (newKm == null) {
		if (lastAM != am) {
		    lastAM.setParent(am.getParent());
		}
		else {
		    lastAM.setParent(null);
		}
	    }
	    else {
		ActionMap newAM = new KeymapActionMap(newKm);
		lastAM.setParent(newAM);
		if (lastAM != am) {
		    newAM.setParent(am.getParent());
		}
	    }
	}
	else if (newKm != null) {
	    am = getActionMap();
	    if (am != null) {
		// Couldn't find it.
		// Set the parent of ActionMap to be the new one.
		ActionMap newAM = new KeymapActionMap(newKm);
		newAM.setParent(am.getParent());
		am.setParent(newAM);
	    }
	}
    
public voidupdateUI()
Reloads the pluggable UI. The key used to fetch the new interface is getUIClassID(). The type of the UI is TextUI. invalidate is called after setting the UI.

        setUI((TextUI)UIManager.getUI(this));
        invalidate();
    
public intviewToModel(java.awt.Point pt)
Converts the given place in the view coordinate system to the nearest representative location in the model. The component must have a positive size for this translation to be computed (i.e. layout cannot be computed until the component has been sized). The component does not have to be visible or painted.

param
pt the location in the view to translate
return
the offset >= 0 from the start of the document, or -1 if the component does not yet have a positive size.
see
TextUI#viewToModel

        return getUI().viewToModel(this, pt);
    
public voidwrite(java.io.Writer out)
Stores the contents of the model into the given stream. By default this will store the model as plain text.

param
out the output stream
exception
IOException on any I/O error

        Document doc = getDocument();
        try {
            getUI().getEditorKit(this).write(out, doc, 0, doc.getLength());
        } catch (BadLocationException e) {
            throw new IOException(e.getMessage());
        }