2

私はこのスレッドが方法を示していることを知っていますが、私の場合は奇妙な振る舞いにつながり、もっと簡単な方法はないのではないかと思います。

JTextAreaテキストを設定した後のサイズを知る必要があります。これが私が今している方法です:

tarea.getLineCount() * tarea.getRowHeight();

行の折り返しがない場合を除いて機能します。行の折り返しでも同じ計算を行いたいのですが。行の折り返しがいつ発生するかを知るために何かありますか?このようにすると、現在の行数を1つ増やすだけで済みます。

編集:

これが(たぶん)私が見つけた解決策です。@camickrによるこれのほとんどコピーペーストです。

int rowStartOffset = textComponent.viewToModel(new Point(0, 0));
int endOffset = textComponent.viewToModel(new Point(0, textComponent.getHeight()));

int count = 0; //used to store the line count
while (rowStartOffset < endOffset) {
    try {
        rowStartOffset = Utilities.getRowEnd(textComponent, rowStartOffset) + 1;
    } catch (BadLocationException ex) {
        break;
    }
    count++;
}

行の折り返しを有効にした場合と有効にしない場合で、いくつかのテストを行いましたが、機能しているように見えました。

4

1 に答える 1

0

setPreferredSizeテキストエリアで呼び出しを行っていない限り、getPreferredSizeメソッドは手間をかけずに探しているものを正確に提供するはずです...

setPreferredSizeこれが、レイアウトを行うために呼び出してはいけない理由です。優先サイズは、コンポーネントによって計算されることになっています (たとえば、テキストが設定されている場合)。

ポイントを見逃している場合はお知らせください;)

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;

public class CalculateTextAreaSize extends Box{

    public CalculateTextAreaSize(){
        super(BoxLayout.Y_AXIS);

        final JTextArea text = new JTextArea("I've\nGot\nA\nLovely\nBunch\nof\nCoconuts!\n");

        JScrollPane pane = new JScrollPane(text);

        add(pane);

        JButton button = new JButton("Set Text!");
        button.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                text.insert("Longish string - how long will it be?", text.getDocument().getLength());
                //The size it will be once everything is figured out
                System.out.println(text.getPreferredSize());
                //The size it is now because no rendering has been done
                System.out.println(text.getSize());
            }
        });
        add(button);
    }

    /**
     * @param args
     */
    public static void main(String[] args) {

        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setContentPane(new CalculateTextAreaSize());
        frame.validate();
        frame.pack();
        frame.setVisible(true);
    }

}
于 2012-10-11T19:49:06.563 に答える