如何创建具有指定宽度和显示所有文本所需的最小高度的 JTextArea?

2022-09-04 22:16:18

在我能找到的所有使用 a 的例子中,高度和宽度在构造之前是已知的,如果 需要更多的高度,那么它被放在一个 .显然,的高度取决于宽度和文本内容。JTextAreaJTextAreaJTextAreaJScrollPaneJTextArea

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

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

我发现了一些类似的线程,它们讨论了与 所涉及的奇怪/错误,这些错误有时通过在父容器上调用两次来解决。这对我来说不是一个选择。我很想创建我自己的宽度和字符串,并根据宽度和字体设置计算必要的最小高度,但我想在花时间这样做之前,我会先询问一下。JTextAreapack()JTextArea

希望我的问题很清楚。谢谢大家的帮助!


答案 1

它使用基于添加组件首选尺寸的绝对定位。

听起来像是布局管理器的工作。

这要求我的JTextArea在getP referedSize()上返回正确的维度。

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() );

答案 2
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);
    }
}

推荐