Swing/LastLineEditableTextArea のバックアップ(No.5)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/LastLineEditableTextArea へ行く。
- category: swing folder: LastLineEditableTextArea title: JTextAreaの最終行だけ編集可能になるよう設定する tags: [DocumentFilter, Element, JTextArea, JTextComponent] author: aterai pubdate: 2012-12-24T00:48:21+09:00 description: DocumentFilterを使用して最終行のみ編集可能なJTextAreaを作成します。 image:
概要
DocumentFilter
を使用して最終行のみ編集可能なJTextArea
を作成します。
Screenshot
Advertisement
サンプルコード
class NonEditableLineDocumentFilter extends DocumentFilter {
public static final String PROMPT = "> ";
@Override public void insertString(
DocumentFilter.FilterBypass fb, int offset, String string,
AttributeSet attr) throws BadLocationException {
if (string == null) {
return;
} else {
replace(fb, offset, 0, string, attr);
}
}
@Override public void remove(
DocumentFilter.FilterBypass fb,
int offset, int length) throws BadLocationException {
replace(fb, offset, length, "", null);
}
@Override public void replace(
DocumentFilter.FilterBypass fb, int offset, int length,
String text, AttributeSet attrs) throws BadLocationException {
Document doc = fb.getDocument();
Element root = doc.getDefaultRootElement();
int count = root.getElementCount();
int index = root.getElementIndex(offset);
Element cur = root.getElement(index);
int promptPosition = cur.getStartOffset()+PROMPT.length();
if (index == count - 1 && offset - promptPosition >= 0) {
if (text.equals("\n")) {
String line = doc.getText(promptPosition, offset - promptPosition);
String[] args = line.split(" ");
String cmd = args[0];
if (cmd.isEmpty()) {
text = "";
} else {
text = String.format("%n%s: command not found", cmd);
}
text += "\n" + PROMPT;
}
fb.replace(offset, length, text, attrs);
}
}
}
View in GitHub: Java, Kotlin解説
DocumentFilter#replace(...)
をオーバーライドDocument#getDefaultRootElement()
でルートエレメントを取得し、Element#getElementCount()
で全体の行数を取得offset
(文字挿入位置)からElement#getElementIndex(offset)
で、挿入位置の行番号と、Element
を取得挿入位置の行番号 == 全体の行数 - 1
となる場合のみ、DocumentFilter.FilterBypass#replace(...)
を実行(編集可能)する- 上記のサンプルでは、コマンドプロンプト風に、最終行の行頭にあるプロンプトは編集不可で、改行の入力ごとに最終行の文字列を評価してメッセージを追加表示している