• 追加された行はこの色です。
  • 削除された行はこの色です。
TITLE:JTextAreaから一行ずつ文字列を取得
#navi(../)
RIGHT:Posted by [[aterai]] at 2006-10-09
RIGHT:Posted by &author(aterai); at 2006-10-09
*JTextAreaから一行ずつ文字列を取得 [#sce4576b]
JTextAreaなどのテキストコンポーネントから一行ずつ文字列を取り出してそれを処理します。

-&jnlp;
-&jar;
-&zip;

//#screenshot
#ref(http://lh3.ggpht.com/_9Z4BYR88imo/TQTNWn74dWI/AAAAAAAAAao/pNdeF8CSOfM/s800/GetLineText.png)

**サンプルコード [#cba0b2ee]
#code{{
#code(link){{
EventQueue.invokeLater(new Runnable() {
  public void run() {
    int count = 0;
    StringTokenizer st = new StringTokenizer(textArea.getText(), "\n") ;
    while(st.hasMoreTokens()) {
      if(st.nextToken().startsWith("#")) {
      count = count + 1;
        count = count + 1;
      }
    }
    //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.startsWith("#")) {
    //      count = count + 1;
    //    }
    //  }
    //}catch(BadLocationException ble) {
    //  ble.printStackTrace();
    //  count = -1;
    //}
    JOptionPane.showMessageDialog(frame, "コメント行数: "+count,
      "タイトル", JOptionPane.INFORMATION_MESSAGE);
  }
});
}}

**解説 [#v1446cab]
上記のサンプルでは、JTextArea#getText() ですべてのテキストを取得し、StringTokenizer を使って行毎に分解しています。

コメントアウトしたコードのようにドキュメントが行を取り出した方が若干速い気((まだ実験したわけではない))がするのですが、行数が少ない場合は簡単なStringTokenizerを使用する方法で問題ないと思います。

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