---
title: JTextAreaから一行ずつ文字列を取得
tags: [JTextArea, StringTokenizer, LineNumberReader]
author: aterai
pubdate: 2006-10-09
description: JTextAreaなどのテキストコンポーネントから一行ずつ文字列を取り出してそれを処理します。
---
* 概要 [#sce4576b]
`JTextArea`などのテキストコンポーネントから一行ずつ文字列を取り出してそれを処理します。

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

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

* 解説 [#v1446cab]
上記のサンプルでは、`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());
    if (line.codePointAt(0) == '#') {
      count++;
    }
  }
} catch (BadLocationException ble) {
  ble.printStackTrace();
}
}}

//* 参考リンク
* コメント [#ee4fa454]
#comment
#comment