# Java: JTextArea

## Description

A `javax.swing.JTextArea` is a multi-line text component to display text or allow the user to enter text. For one line of text use JTextField.

## Using a JTextArea for output -- Setting the text

Assume: `JTextArea ta; int i, w, pos, start, end, line; String s; boolean b; Font f;
Reader reader; Writer writer;`

Result | Method | Description
--- | --- | ---
Constructors
`ta =` | `new JTextArea(rows, cols);` | Creates text area. cols is approx char width.
`ta =` | `new JTextArea(s, rows, cols);` | As above, but also containing initial string s.
Setting text
`` | `ta.setText(s);` | Replaces all text with `s`.
`` | `ta.append(s);` | Appends s to the end.
`` | `ta.insert(s, pos);` | Inserts s at position pos.
`` | `ta.replaceRange(s, start, end);` | Replace start to end with s.
Getting text
`s =` | `ta.getText();` | Returns all text. Use methods below to get individual lines.
`i =` | `ta.getLineCount();` | Returns number of lines in the text area.
`i =` | `ta.getLineStartOffset(line);` | Returns character index of beginning of line line. May throw javax.swing.text.BadLocationException.
`i =` | `ta.getLineEndOffset(line);` | Returns character index of end of line line. May throw javax.swing.text.BadLocationException.
Changing the appearance/function
`` | `ta.setBorder(brdr);` | Text is tight against edge. See example below to add space.
`` | `ta.setLineWrap(b);` | Lines wrapped if true. Default false.
`` | `ta.setWrapStyleWord(b);` | If wrapping on (see above), wraps at words (true) or chars (false). Default false.
`` | `ta.setTabSize(w);` | Number of max width chars in a tab.
`` | `ta.setFont(f);` | Displays using Font f.
`` | `ta.setEditable(b);` | Set false to disable user editing.
`` | `ta.setCaretPosition(i);` | Set caret position. If content is scrolled, setCaretPosition(0) will move to top.
Reading and writing to/from a JTextArea
`` | `ta.read(reader, null);` | Reads text from reader into text area. May throw IOException.
`` | `ta.write(writer);` | Writes text from text area to writer. May throw IOException.

## Scrolling

JTextArea doesn't support scrolling itself but you can easily add the JTextArea to a JScrollPane. JScrollPane creates scrollbars as needed. For example,

    //... Create scrolling text area.
    resultTA = new JTextArea("This is a test", 10, 80);
    JScrollPane scrollingResult = new JScrollPane(resultTA);
    content.add(scrollingResult);

### Scrollbar policy

There are three policies that you can specify for the scrollbars. Below is how you set if for the horizontal scrollbar, but change "horizontal" to "vertical" as needed.

- `ScrollPaneConstants.HORIZONTAL_SCROLLBAR_AS_NEEDED` - Default value.
- `ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER`
- `ScrollPaneConstants.HORIZONTAL_SCROLLBAR_ALWAYS`

Result | Method | Description
--- | --- | ---
`` | `scrollPane.setHorizontalScrollBarPolicy(policy);` | Where policy is described above.
`` | `scrollPane.setVerticalScrollBarPolicy(policy);` | Where policy is described above.

It's Unncessary to have horizontal scrolling when wrapping is turned on. Wrapping takes precedence over horizontal scrolling.

### Positioning the scrolling view to the top - moving the caret

If more lines are added than can be displayed and the scrollbars appear, the position that shows can be controlled with setCaretPosition(pos), where pos is a character position between 0 and the length of the text. To move to the top, use position 0.

## Space between text and edge improves appearance

`JTextArea` leaves no space between the edge and text that it holds. This can be fixed by adding an empty border to it.

    outArea.setBorder(BorderFactory.createEmptyBorder(4, 4, 4, 4));

See Borders.

## Example: Common JTextArea+JScrollPane usage

Setting up a text area can be slightly tedious. Here is an example.

    JTextArea outputTA = new JTextArea(12, 40);
    . . .
    outputTA.setLineWrap(true);
    outputTA.setWrapStyleWord(true);
    outputTA.setBorder(BorderFactory.createEmptyBorder(4, 4, 4, 4));

    JScrollPane scroller = new JScrollPane(outputTA);
    scroller.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);
    . . .
    content.add(scroller, ...);

## Example: Getting and setting all lines sequentially

The following code shows how to sequentially get and set each line in a `JTextArea` Assume `inputArea` has the input and `outputArea` will receive the output. Of course, this is a ridiculous way to copy from one text area to another; it would be better to just write `outputArea.setText(inputArea.getText());`, but it wouldn't illustrate working with individual lines.

    JTextArea inputArea  = new JTextArea(40, 20);
    JTextArea outputArea = new JTextArea(40, 20);
    . . .
        outputArea.setText("");           // Empties the textarea

        String text = inputArea.getText();
        int totalLines = inputArea.getLineCount();
        for (int i=0; i < totalLines; i++) {
            int start = inputArea.getLineStartOffset(i);
            int end   = inputArea.getLineEndOffset(i);
            String line = text.substring(start, end);

            outputArea.append(line + "\n");
        }

## Example

See Example - JTextArea.

## Other

JTextArea is a child class of JTextComponent, therefore the methods of JTextComponent are available, for example, to find and set the caret position or selected text, to handle cut, copy, paste operations to/from the clipboard, and even read and write methods.