JTextArea内に文章が記述されている時、その文章の行数を取得したいのですが、
getRowsやgetColumnsでは出来いみたいです。
おそらくメソッドでは用意されてないようなのですが、どうすれば行数を取得できますか。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答2件
0
Element#getElementCount()メソッドで行数を取得可能です。
java
1import java.awt.*; 2import java.util.Collections; 3import javax.swing.*; 4import javax.swing.event.*; 5import javax.swing.text.*; 6public final class JTextAreaTest { 7 private Component makeUI() { 8 JTextArea textArea = new JTextArea( 9 String.join("\n", Collections.nCopies(2000, "aaaaa"))); 10 11 JButton button = new JButton("aaaa"); 12 button.addActionListener(e -> { 13 Document doc = textArea.getDocument(); 14 Element root = doc.getDefaultRootElement(); 15 int count = root.getElementCount(); 16 System.out.println("ElementCount: " + count); 17 }); 18 19 JPanel p = new JPanel(new BorderLayout()); 20 p.add(new JScrollPane(textArea)); 21 p.add(button, BorderLayout.SOUTH); 22 return p; 23 } 24 public static void main(String... args) { 25 EventQueue.invokeLater(() -> { 26 JFrame f = new JFrame(); 27 f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 28 f.getContentPane().add(new JTextAreaTest().makeUI()); 29 f.setSize(320, 240); 30 f.setLocationRelativeTo(null); 31 f.setVisible(true); 32 }); 33 } 34} 35
追記
- JTextArea#getLineCount() (Java Platform SE 8)でも全体の行数を取得できます。
JTextArea#getLineCount()
メソッド内でElement#getElementCount()
を使用している。- ドキュメントが「領域内に収める行数を返します。」になっていて、意味が分かりづらいですが...
投稿2018/01/29 09:09
編集2018/01/29 09:21総合スコア158
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
「子要素」と「行」は厳密には「違う概念」だと思います。「子要素」が行ではなく「色などの属性が他のテキストと異なる一部分」を意味する場合もあるのではないでしょうか?
JTextAreaではテキストの構造を子要素に分割する基準が「行」と一致するのかも知れませんが・・・
そのあたりは如何でしょう?
2018/01/29 09:28 編集
JTextAreaの使用するドキュメントはPlainDocumentで、その説明には「文字の属性をまったく保持しないプレーンなドキュメントです。デフォルトでは、このドキュメントの要素の構造は、テキスト内の行をマップしたものになります。getDefaultRootElementメソッドが返すElementは行のマップを表し、各子要素は単一の行を表します。」とあるため、「行」と一致すると考えて良さそうです。
2018/01/29 09:38
なるほどドキュメントに行と要素構造が一致すると明記されているなら安心ですね。
まぁそれでも個人的にはgetLineCountがなぜ定義されているかを考えるに、そちらを用いた方が素直であるとは思います。
2018/01/29 09:59
確かに「JTextArea#getLineCount()が素直」ですね。言い訳すると最初getLineCountの説明には「領域内に収める行数を返します。」とあるので、JTextAreaの中身の行数ではなく、JScrollPane内でJTextAreaの高さを決めるためのデフォルト表示行数か何かだと勘違いしていましたw。getLineStartOffsetなどの例外の説明にある「ドキュメントに含まれる行数(getLineCountから報告される)」の方が意味が分かりやすい気がします。
2018/01/29 10:03
> デフォルト表示行数か何かだと勘違い
確かに。自分も迷って実装を調べそうです。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。