---
category: swing
folder: GetLineText
title: JTextAreaから一行ずつ文字列を取得
tags: [JTextArea, StringTokenizer, LineNumberReader]
author: aterai
pubdate: 2006-10-09T22:13:19+09:00
description: JTextAreaなどのテキストコンポーネントから一行ずつ文字列を取り出してそれを処理します。
image: https://lh3.googleusercontent.com/_9Z4BYR88imo/TQTNWn74dWI/AAAAAAAAAao/pNdeF8CSOfM/s800/GetLineText.png
---
* 概要 [#summary]
`JTextArea`などのテキストコンポーネントから一行ずつ文字列を取り出してそれを処理します。

#download(https://lh3.googleusercontent.com/_9Z4BYR88imo/TQTNWn74dWI/AAAAAAAAAao/pNdeF8CSOfM/s800/GetLineText.png)

* サンプルコード [#sourcecode]
#code(link){{
int count = 0;
StringTokenizer st = new StringTokenizer(textArea.getText(), "\n");
while (st.hasMoreTokens()) {
  if (st.nextToken().codePointAt(0) == '#') {
    count++;
  }
}
}}

* 解説 [#explanation]
上記のサンプルでは、`JTextArea#getText()`ですべてのテキストを取得し、`StringTokenizer`を使って行毎に分解しています。`returnDelims`フラグが`false`なので、トークンが空行になることはありません。

----
- `String#split(...)`を使用する場合
-- 空行あり

#code{{
for (String line: textArea.getText().split("\\n")) {
  if (!line.isEmpty() && line.codePointAt(0) == '#') {
    count++;
  }
}
}}

- `LineNumberReader`を使用する場合
-- 空行あり

#code{{
try (LineNumberReader lnr = new LineNumberReader(new StringReader(textArea.getText()))) {
  String line = null;
  while ((line = lnr.readLine()) != null) {
    if (!line.isEmpty() && line.codePointAt(0) == '#') {
      count++;
    }
  }
} catch (IOException ioe) {
  ioe.printStackTrace();
}
}}

- `Element#getElementCount()`を使用する場合
-- 空行なし(`Element`には少なくとも長さ`1`の改行が存在する)

#code{{
Document doc = textArea.getDocument();
Element root = doc.getDefaultRootElement();
try {
  for (int i = 0; i < root.getElementCount(); i++) {
    Element elem = root.getElement(i);
    String line = doc.getText(elem.getStartOffset(), elem.getEndOffset() - elem.getStartOffset());
    Element elm = root.getElement(i);
    String line = doc.getText(elm.getStartOffset(), elm.getEndOffset() - elm.getStartOffset());
    if (line.codePointAt(0) == '#') {
      count++;
    }
  }
} catch (BadLocationException ble) {
  ble.printStackTrace();
}
}}

* 参考リンク [#reference]
- [https://docs.oracle.com/javase/jp/8/docs/api/java/util/StringTokenizer.html StringTokenizer (Java Platform SE 8)]
- [https://docs.oracle.com/javase/jp/8/docs/api/java/io/LineNumberReader.html LineNumberReader (Java Platform SE 8)]
- [https://docs.oracle.com/javase/jp/8/docs/api/javax/swing/text/Element.html#getElementCount-- Element#getElementCount() (Java Platform SE 8)]

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