13

在我能找到的所有使用 a 的示例中JTextArea,高度和宽度在构造 a 之前是已知的JTextArea,如果JTextArea需要更多高度,则将其放在 a 内JScrollPane。显然,高度JTextArea取决于宽度和文本内容。

现在,我的情况要求我不要使用 a JScrollPane,而是JTextArea要足够高以显示所有文本。当我创建 时JTextArea,我知道文本内容以及它必须使用的宽度;我不知道高度 - 我希望它尽可能小而不切断任何文本。这似乎很难实现。

作为旁注,JTextArea将被添加到JPanel没有布局管理器的组件中 - 它使用基于添加组件的首选大小的绝对定位。这要求 myJTextArea将返回正确的尺寸getPreferredSize()。正确的尺寸应该是我在构建它时提供的宽度,以及显示具有提供的宽度的所有文本所需的最小高度。

我发现了一些类似的线程,它们讨论了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 回答