TextArea 核心特性
- 多行文字編輯區域,支援換行、捲動
- 繼承
TextComponent,擁有 TextField 所有功能 (選取、複製、剪貼等)
- 進階編輯:
appendText(), insertText(), replaceText() (Java 1.0) / append(), insert(), replaceRange() (1.1+)
- Java 1.0:永遠顯示垂直+水平捲軸
- Java 1.1+:建構子參數控制捲軸策略
Java 1.0 範例:TextArea1
//: TextArea1.java
public class TextArea1 extends Applet {
TextArea t1 = new TextArea("t1", 1, 30); // 1行 x 30字元
TextArea t2 = new TextArea("t2", 4, 30); // 4行 x 30字元
Button b1 = new Button("Text Area 1"), b2 = new Button("Text Area 2"),
b3 = new Button("Replace Text"), b4 = new Button("Insert Text");
public void init() {
add(b1); add(t1); add(b2); add(t2); add(b3); add(b4);
}
public boolean action(Event evt, Object arg) {
if (evt.target.equals(b1)) showStatus(t1.getText());
else if (evt.target.equals(b2)) {
t2.setText("Inserted by Button 2");
t2.appendText(": " + t1.getText());
showStatus(t2.getText());
} else if (evt.target.equals(b3)) {
String s = " Replacement ";
t2.replaceText(s, 3, 3 + s.length()); // 替換位置3長度s.length()
} else if (evt.target.equals(b4)) {
t2.insertText(" Inserted ", 10); // 位置10插入
} else return super.action(evt, arg);
return true;
}
}
關鍵編輯方法對照
| Java 1.0 | Java 1.1+ | 說明 |
appendText(String) | append(String) | 尾部追加 |
insertText(String, pos) | insert(String, pos) | 指定位置插入 |
replaceText(String, start, end) | replaceRange(String, start, end) | 範圍替換 [start, end) |
getText() | getText() | 取得全部文字 |
getSelectedText() | getSelectedText() | 取得選取文字 |
setEditable(boolean) | setEditable(boolean) | 設定可編輯性 |
Java 1.1+ 捲軸控制建構子
new TextArea(text, rows, cols, SCROLLBARS_NONE);
new TextArea(text, rows, cols, SCROLLBARS_VERTICAL_ONLY);
new TextArea(text, rows, cols, SCROLLBARS_HORIZONTAL_ONLY);
new TextArea(text, rows, cols, SCROLLBARS_BOTH); // 預設
- 捲軸策略建構時決定,運行期不可變更
- 即使無捲軸,游標鍵導航仍受限於可視區域
現代化對應
| 技術 | 核心類別 | 關鍵增強 |
| Swing | JTextArea + JScrollPane | 捲軸策略動態可改 (setVerticalScrollBarPolicy())、行號顯示、摺疊、高亮、Document 模型分離、Undo/Redo 支援 |
| JavaFX | TextArea | CSS 樣式、豐富文字 (非純文字)、提示文字 (promptText)、屬性綁定、虛擬化大文檔 |
| Web | <textarea> | 原生多行、maxlength, placeholder, wrap、JS 富文本編輯器 (Quill, TipTap, ProseMirror) |
最佳實踐
- 唯讀日誌/輸出區:
setEditable(false) + append(),配合 DefaultCaret.ALWAYS_UPDATE (Swing) 自動捲動到底。
- 大量文字 (MB 級) 必須使用虛擬化/分頁載入,避免記憶體/效能問題。
- 程式化修改大量文字時,Swing 使用
Document 批次更新,JavaFX 使用 TextArea 直接操作均可。
- 捲軸策略:編輯區預設 BOTH,日誌區 VERTICAL_ONLY,代碼編輯器 BOTH + 行號。
總結
TextArea 是「多行純文字編輯」的基石元件。Java 1.0 固定雙捲軸,1.1+ 引入建構子控制但運行期不可變。現代 JTextArea + JScrollPane 實現捲軸策略動態控制、文檔模型分離、Undo/Redo、語法高亮等專業編輯器功能。理解 append/insert/replaceRange 三大編輯原語,是實作日誌檢視器、代碼編輯器、表單輸入區的基礎。