Swing/GetLineText のバックアップの現在との差分(No.9)
TITLE:JTextAreaから一行ずつ文字列を取得
Posted by aterai at 2006-10-09
JTextAreaから一行ずつ文字列を取得
JTextAreaなどのテキストコンポーネントから一行ずつ文字列を取り出してそれを処理します。- category: swing folder: GetLineText title: JTextAreaから一行ずつ文字列を取得 tags: [JTextArea, StringTokenizer, LineNumberReader] author: aterai pubdate: 2006-10-09T22:13:19+09:00 description: JTextAreaなどのテキストコンポーネントから一行ずつ文字列を取り出してそれを処理します。 image:
概要
JTextArea
などのテキストコンポーネントから一行ずつ文字列を取り出してそれを処理します。
- &jnlp;
- &jar;
- &zip;
Screenshot
Advertisement
サンプルコード
サンプルコード
#spanend
#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
* 解説 [#explanation]
#spanend
#spanadd
上記のサンプルでは、`JTextArea#getText()`ですべてのテキストを取得してから`StringTokenizer`を使って行毎に分解しています。`returnDelims`フラグが`false`なのでトークンが空行になることはありません。
#spanend
#spanadd
#spanend
----
- `String#split(...)`を使用する場合
-- 空行あり
#spanadd
#spanend
#spanadd
#code{{
#spanend
#spanadd
for (String line: textArea.getText().split("\\n")) {
#spanend
if (!line.isEmpty() && line.codePointAt(0) == '#') {
count++;
}
#spanadd
}
#spanend
#spanadd
View in GitHub: Java, Kotlin-
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++;
}
//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);
}
#spandel
});
#spanend
#spanadd
} catch (IOException ioe) {
#spanend
ioe.printStackTrace();
#spanadd
}
#spanend
解説
上記のサンプルでは、JTextArea#getText() ですべてのテキストを取得し、StringTokenizer を使って行毎に分解しています。-
Element#getElementCount()
を使用する場合- 空行なし(
Element
には少なくとも長さ1
の改行が存在する)
- 空行なし(
#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