Swing/NonEditableLine のバックアップ(No.13)
- バックアップ一覧
 - 差分 を表示
 - 現在との差分 を表示
 - 現在との差分 - Visual を表示
 - ソース を表示
 - Swing/NonEditableLine へ行く。
  
- 1 (2010-03-08 (月) 12:38:50)
 - 2 (2010-03-08 (月) 13:43:45)
 - 3 (2012-06-22 (金) 18:05:32)
 - 4 (2012-12-24 (月) 00:49:28)
 - 5 (2013-01-02 (水) 14:27:51)
 - 6 (2013-12-24 (火) 20:19:05)
 - 7 (2014-12-30 (火) 15:41:26)
 - 8 (2015-01-25 (日) 18:33:41)
 - 9 (2016-07-08 (金) 12:57:33)
 - 10 (2017-09-26 (火) 11:02:51)
 - 11 (2019-03-26 (火) 19:08:38)
 - 12 (2021-01-07 (木) 16:49:10)
 - 13 (2023-07-07 (金) 13:53:47)
 - 14 (2025-01-03 (金) 08:57:02)
 - 15 (2025-01-03 (金) 09:01:23)
 - 16 (2025-01-03 (金) 09:02:38)
 - 17 (2025-01-03 (金) 09:03:21)
 - 18 (2025-01-03 (金) 09:04:02)
 - 19 (2025-06-19 (木) 12:41:37)
 - 20 (2025-06-19 (木) 12:43:47)
 
 
- category: swing
folder: NonEditableLine
title: JTextAreaの一部を編集不可にする
tags: [JTextArea, DocumentFilter, Highlighter]
author: aterai
pubdate: 2010-02-22T14:50:22+09:00
description: JTextAreaの一部の行を編集不可になるよう設定します。
image: 

 
概要
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(); }