JTextAreaの一部を編集不可にする
Total: 7281
, Today: 1
, Yesterday: 2
Posted by aterai at
Last-modified:
概要
JTextArea
の一部の行を編集不可になるよう設定します。
Screenshot
Advertisement
サンプルコード
class NonEditableLineDocumentFilter extends DocumentFilter {
@Override public void insertString(
FilterBypass fb, int offset, String string, AttributeSet attr)
throws BadLocationException {
if (Objects.nonNull(string)) {
replace(fb, offset, 0, string, attr);
}
}
@Override public void remove(
FilterBypass fb, int offset, int length)
throws BadLocationException {
replace(fb, offset, length, "", null);
}
@Override public void replace(
FilterBypass fb, int offset, int length, String text, AttributeSet attrs)
throws BadLocationException {
Document doc = fb.getDocument();
if (doc.getDefaultRootElement().getElementIndex(offset) < 2) {
return;
}
fb.replace(offset, length, text, attrs);
}
}
View in GitHub: Java, Kotlin解説
上記のサンプルでは、DocumentFilter
を使ってJTextArea
の1
行目と2
行目で文字の追加、削除などの編集が不可になるよう設定しています。
((AbstractDocument) textArea.getDocument()).setDocumentFilter(
new NonEditableLineDocumentFilter());
1
行目と2
行目の背景色は編集不可のためのDocumentFilter
とは無関係にHighlighter
を使用して設定try { Highlighter hilite = textArea.getHighlighter(); Document doc = textArea.getDocument(); Element root = doc.getDefaultRootElement(); for (int i = 0; i < 2; i++) { Element elem = root.getElement(i); hilite.addHighlight(elem.getStartOffset(), elem.getEndOffset() - 1, highlightPainter); } } catch (BadLocationException ble) { ble.printStackTrace(); }