TITLE:JTextAreaから一行ずつ文字列を取得

JTextAreaから一行ずつ文字列を取得

編集者:Terai Atsuhiro~

作成日:2006-10-09
更新日:2023-07-07 (金) 13:58:07
  • 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

概要

JTextAreaなどのテキストコンポーネントから一行ずつ文字列を取り出してそれを処理します。

概要

JTextAreaなどのテキストコンポーネントから一行ずつ文字列を取り出してそれを処理します。

サンプルコード

#spanend
#spanadd
int count = 0;
#spanend
#spanadd
StringTokenizer st = new StringTokenizer(textArea.getText(), "\n");
#spanend
#spanadd
while (st.hasMoreTokens()) {
#spanend
  if (st.nextToken().codePointAt(0) == '#') {
    count++;
  }
#spanadd
}
#spanend
#spanadd
View in GitHub: Java, Kotlin

#screenshot

解説

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

サンプルコード

  • -
  • String#split(...)を使用する場合
    • 空行あり
#spandel
EventQueue.invokeLater(new Runnable() {
#spanend
  public void run() {
    int count = 0;
    StringTokenizer st = new StringTokenizer(textArea.getText(), "\n") ;
    while(st.hasMoreTokens()) {
      if(st.nextToken().startsWith("#")) {
      count = count + 1;
#spanadd
for (String line: textArea.getText().split("\\n")) {
#spanend
  if (!line.isEmpty() && line.codePointAt(0) == '#') {
    count++;
  }
#spanadd
}
#spanend
#spanadd
  • LineNumberReaderを使用する場合
    • 空行あり
#spanend
#spanadd
try (LineNumberReader lnr = new LineNumberReader(new StringReader(txa.getText()))) {
#spanend
  String line = null;
  while ((line = lnr.readLine()) != null) {
    if (!line.isEmpty() && line.codePointAt(0) == '#') {
      count++;
    }
  }
#spandel
//Document doc = textArea.getDocument();
#spanend
#spandel
//Element root = doc.getDefaultRootElement();
#spanend
#spandel
//try{
#spanend
#spandel
//  for(int i=0;i<root.getElementCount();i++) {
#spanend
#spandel
//    Element elem = root.getElement(i);
#spanend
#spandel
//    String line = doc.getText(elem.getStartOffset(),
#spanend
#spandel
//                              elem.getEndOffset()-elem.getStartOffset());
#spanend
#spandel
//    if(line.startsWith("#")) {
#spanend
#spandel
//      count = count + 1;
#spanend
#spandel
//    }
#spanend
#spandel
//  }
#spanend
#spandel
//}catch(BadLocationException ble) {
#spanend
#spandel
//  ble.printStackTrace();
#spanend
#spandel
//  count = -1;
#spanend
#spandel
//}
#spanend
#spandel
//......
#spanend
#spanadd
} catch (IOException ioe) {
#spanend
  ioe.printStackTrace();
#spanadd
}
#spanend
  • &jnlp;
  • &jar;
  • &zip;

解説

上記のサンプルでは、JTextArea#getText() ですべてのテキストを取得し、StringTokenizer を使って行毎に分解しています。
  • Element#getElementCount()を使用する場合
    • 空行なし(Elementには少なくとも長さ1の改行が存在する)
コメントアウトしたコードのようにドキュメントが行を取り出した方が若干速い気*1がするのですが、行数が少ない場合は簡単なStringTokenizerを使用する方法で問題ないと思います。
#spanend
#spanadd
Document doc = textArea.getDocument();
#spanend
#spanadd
Element root = doc.getDefaultRootElement();
#spanend
#spanadd
try {
#spanend
  for (int i = 0; i < root.getElementCount(); i++) {
    Element elm = root.getElement(i);
    String line = doc.getText(
        elm.getStartOffset(), elm.getEndOffset() - elm.getStartOffset());
    if (line.codePointAt(0) == '#') {
      count++;
    }
  }
#spanadd
} catch (BadLocationException ble) {
#spanend
  ble.printStackTrace();
#spanadd
}
#spanend
#spanadd

コメント

参考リンク

コメント