すべてのテキストを表示するのに必要な幅と可能な限り最小の高さでJTextareaを作成するにはどうすればよいですか?
-
28-09-2019 - |
質問
私がそれを使用することができるすべての例で JTextArea
, 、高さと幅は、構築する前に知られています JTextArea
, 、そして JTextArea
より多くの高さが必要になると、それは JScrollPane
. 。明らかに、の高さ JTextArea
幅とテキストの内容に依存します。
今、私の状況では、私が使用しないことが必要です JScrollPane
, 、しかしその代わりに JTextArea
すべてのテキストを表示するのに十分な高さになります。私が作成するとき JTextArea
, 、テキストの内容と、どのくらいの幅で作業しなければならないかを知っています。私は高さを知りません - 私はそれがテキストを遮断することなく、できるだけ小さくしたいです。これを達成するのは非常に難しいようです。
サイドノートとして、 JTextArea
に追加されます JPanel
レイアウトマネージャーはありません - 追加されたコンポーネントの優先サイズに基づいて、絶対的なポジショニングを使用します。これには私が必要です JTextArea
正しい寸法を返します getPreferredSize()
. 。正しい寸法は、私がそれを構築したときに提供した幅と、提供された幅ですべてのテキストを表示するために必要な最小高さである必要があります。
に関与する奇妙さ/バグについて議論するいくつかの同様のスレッドを見つけました JTextArea
それは時々呼び出すことによって解決されます pack()
親コンテナに2回。これは私にとって選択肢ではありません。私は基本的に自分のものを作りたいと思っています JTextArea
幅と文字列を取り、幅とフォントの設定に基づいて必要な最小高さを計算しますが、それを行うために時間を費やす前に最初に尋ねると思いました。
うまくいけば、私の質問は明らかです。皆様のご協力ありがとうございます!
解決
追加されたコンポーネントの優先サイズに基づいて、絶対的な位置決めを使用します。
レイアウトマネージャーの仕事のように聞こえます。
これには、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() );
他のヒント
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 &" +
" (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);
}
}
sixedwidthlabelで説明されているソリューション <html><body width="..."
プログラマーがHTML文字列の一部としてメッセージを提供するように要求します。
メッセージが似ている場合 invalid integer: i<0 not allowed
、 そうして <
逃げる必要があります(エンコードされますか?)。そうしないと、JlabelがHTMLをどのように解釈するかはわかりません。
これにより、このソリューションに複雑さが加わります。
メッセージにそのようなキャラクターが含まれていないことがわかっている場合にのみ、あなたは元気になります。
おそらく、幅を知っているなら、いくつかのテストを実行し、テキストの各文字がどれだけ広いかを計算できます。そのため、ループを使用して、各行に合う数文字と表示される文字の合計を判断できます。ある行の数に基づいて高さを設定できます。
テキストには空白を含む1000文字があり、文字の幅は4ピクセルに相当します。その後、幅が400の場合、各ラインに100文字が収まる場合、10行が必要になります。フォントサイズの高さは10であると言うと、10 x 10 == 100ピクセルが必要なので、テキストアレアは400x100でなければなりません