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

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

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

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

我发现了一些类似的线程,讨论了JTextArea所涉及的奇怪/错误,有时通过在父容器上调用pack()两次来解决。 这不是我的选择。 我很想创建我自己的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 = "

Label Height

" + "

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.

" + "

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

在FixedWidthLabel中描述的解决方案,使用将要求程序员将消息作为html字符串的一部分提供。

如果消息类似于invalid integer: i<0 not allowed ,则<必须进行转义(编码?),否则无法解释JLabel如何解释html。

这增加了该解决方案的复杂性。

只有当您知道该消息不包含任何此类字符时,您才会好。

好吧,也许如果你知道你的宽度你可以运行一些测试并计算每个文本字符的宽度,这样你就可以使用一个循环来确定每行上适合的字符数和要显示的字符总数,然后你可以根据有多少行来设置高度。

假设您的文本包含1000个字符(包括空格),并且字符的宽度相当于4像素,那么如果宽度为400,则每行可以容纳100个字符,那么您将需要10行。 现在说字体大小的高度是10,你现在知道你需要10 x 10 == 100像素,所以你的TextArea应该是400×100