13

を使用していることがわかるすべての例では、 をJTextArea構築する前に高さと幅がわかっています。さらに高さが必要なJTextArea場合は、 . 明らかに、高さは幅とテキストの内容に依存します。JTextAreaJScrollPaneJTextArea

現在、私の状況では、 を使用せず、JScrollPaneすべてJTextAreaのテキストを表示するのに十分な高さである必要があります。を作成するときJTextArea、テキストの内容と、どのくらいの幅で作業する必要があるかを知っています。高さがわかりません。テキストを切り取らずに、できるだけ小さくしたいのです。これを達成するのは非常に難しいようです。

補足として、はレイアウト マネージャーを持たない に追加されます。追加されたコンポーネントの優先サイズに基づいて絶対配置が使用されますJTextAreaJPanelこれには、 myJTextAreaが で正しい寸法を返す必要がありますgetPreferredSize()。正しい寸法は、作成時に指定した幅と、指定された幅ですべてのテキストを表示するために必要な最小の高さである必要があります。

親コンテナーで 2 回JTextArea呼び出すことで解決されることがある、に関連する奇妙/バグについて議論する同様のスレッドをいくつか見つけました。pack()これは私にとって選択肢ではありません。私は基本的にJTextArea、幅と文字列を取り、幅とフォントの設定に基づいて必要な最小の高さを計算する独自のものを作成したいと思っていますが、時間を費やす前に最初に尋ねることにしました。

うまくいけば、私の質問は明確です。ご協力ありがとうございました!

4

4 に答える 4

6

追加されたコンポーネントの優先サイズに基づく絶対配置を使用します。

レイアウトマネージャーの仕事のように聞こえます。

これには、私の JTextArea が getPreferredSize() で正しいサイズを返す必要があります。

JTextArea textArea = new JTextArea();
textArea.setLineWrap( true );
textArea.setWrapStyleWord( true );
textArea.setText("one two three four five six seven eight nine ten");
System.out.println("000: " + textArea.getPreferredSize());
textArea.setSize(100, 1);
System.out.println("100: " + textArea.getPreferredSize());
textArea.setSize( textArea.getPreferredSize() );
于 2010-11-03T02:40:29.123 に答える
5
import java.awt.*;
import javax.swing.*;

class FixedWidthLabel {

    public static void main(String[] args) {

        Runnable r = new Runnable() {
            public void run() {
                String pt1 = "<html><body width='";
                String pt2 =
                    "px'><h1>Label Height</h1>" +
                    "<p>Many Swing components support HTML 3.2 &amp;" +
                    " (simple) CSS.  By setting a body width we can cause the " +
                    " component to find the natural height needed to display" +
                    " the component.<br><br>" +
                    "<p>The body width in this text is set to " +
                    "";
                String pt3 =
                    " pixels." +
                    "";

                JPanel p = new JPanel( new BorderLayout() );

                JLabel l1 = new JLabel( pt1 + "125" + pt2 + "125" + pt3 );
                p.add(l1, BorderLayout.WEST);

                JLabel l2 = new JLabel( pt1 + "200" + pt2 + "200" + pt3 );
                p.add(l2, BorderLayout.CENTER);

                JOptionPane.showMessageDialog(null, p);
            }
        };
        SwingUtilities.invokeLater(r);
    }
}
于 2010-11-04T02:25:19.960 に答える
0

FixedWidthLabelで説明されているソリューションを使用<html><body width="..." すると、プログラマーはhtml文字列の一部としてメッセージを提供する必要があります。

メッセージがのようなものinvalid integer: i<0 not allowedである場合は、<をエスケープする(エンコードする?)必要があります。そうでない場合、JLabelがhtmlをどのように解釈するかがわかりません。

これにより、このソリューションは複雑になります。

メッセージにそのような文字が含まれていないことがわかっている場合にのみ、大丈夫です。

于 2011-07-11T13:39:26.813 に答える
-1

おそらく、幅がわかっている場合は、いくつかのテストを実行して、テキストの各文字の幅を調べることができます。そのようにして、ループを使用して各行に収まる文字数を決定し、表示される文字を合計します。行数に基づいて高さを設定できます。

テキストが空白を含めて 1000 文字あり、文字の幅が 4 ピクセルに相当するとします。幅が 400 の場合、各行に 100 文字が収まると計算でき、その後 10 行が必要になります。フォント サイズの高さが 10 だとすると、10 x 10 == 100 ピクセルが必要であることがわかったので、TextArea は 400x100 にする必要があります。

于 2010-11-03T02:24:42.103 に答える