• 追加された行はこの色です。
  • 削除された行はこの色です。
TITLE:JTextAreaの一部を編集不可にする
#navi(../)
RIGHT:Posted by [[terai]] at 2010-02-22
*JTextAreaの一部を編集不可にする [#qcda2065]
JTextAreaの一部の行を編集不可になるよう設定します。
---
category: swing
folder: NonEditableLine
title: JTextAreaの一部を編集不可にする
tags: [JTextArea, DocumentFilter, Highlighter]
author: aterai
pubdate: 2010-02-22T14:50:22+09:00
description: JTextAreaの一部の行を編集不可になるよう設定します。
image: https://lh4.googleusercontent.com/_9Z4BYR88imo/TQTQW4ZQhAI/AAAAAAAAAfc/JkImmzMvG6I/s800/NonEditableLine.png
---
* 概要 [#summary]
`JTextArea`の一部の行を編集不可になるよう設定します。

-&jnlp;
-&jar;
-&zip;
#download(https://lh4.googleusercontent.com/_9Z4BYR88imo/TQTQW4ZQhAI/AAAAAAAAAfc/JkImmzMvG6I/s800/NonEditableLine.png)

#screenshot

**サンプルコード [#d9a23670]
#code{{
* サンプルコード [#sourcecode]
#code(link){{
class NonEditableLineDocumentFilter extends DocumentFilter {
  @Override
  public void insertString(DocumentFilter.FilterBypass fb, int offset,
        String string, AttributeSet attr) throws BadLocationException {
    if(string == null) {
      return;
    }else{
  @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(DocumentFilter.FilterBypass fb, int offset, int length)
                                               throws BadLocationException {

  @Override public void remove(
      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 {

  @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;
    if (doc.getDefaultRootElement().getElementIndex(offset) < 2) {
      return;
    }
    fb.replace(offset, length, text, attrs);
  }
}
}}

**解説 [#c7b230d4]
上記のサンプルでは、DocumentFilterを使って、JTextAreaの一行目と二行目で追加、削除などの編集ができないようになっています。
* 解説 [#explanation]
上記のサンプルでは、`DocumentFilter`を使って`JTextArea`の`1`行目と`2`行目で文字の追加、削除などの編集が不可になるよう設定しています。

#code{{
((AbstractDocument)textArea.getDocument()).setDocumentFilter(new NonEditableLineDocumentFilter());
((AbstractDocument) textArea.getDocument()).setDocumentFilter(
    new NonEditableLineDocumentFilter());
}}

**参考リンク [#j8d6a25e]
-[[Document Guard - Santhosh Kumar's Weblog>http://www.jroller.com/santhosh/date/20050622]]
- `1`行目と`2`行目の背景色は編集不可のための`DocumentFilter`とは無関係に`Highlighter`を使用して設定
#code{{
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();
}
}}

**コメント [#y8571e33]
* 参考リンク [#reference]
- [http://www.jroller.com/santhosh/date/20050622 Document Guard - Santhosh Kumar's Weblog]
- [[JTextAreaの最終行だけ編集可能になるよう設定する>Swing/LastLineEditableTextArea]]

* コメント [#comment]
#comment
#comment