在所有可以找到使用的示例中 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 = "<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);
    }
}

使用固定旋转标签中描述的解决方案,使用 <html><body width="..."将要求程序员作为HTML字符串的一部分提供消息。

如果消息是类似的 invalid integer: i<0 not allowed ,然后 < 将不得不逃脱(编码?),否则就不会说Jlabel将如何解释HTML。

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

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

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

假设您的文本具有1000个字符,包括空格,并且字符的宽度相当于4pixels,那么如果宽度为100个字符的宽度,则可以解决每条线上的400个宽度,然后您需要10行。现在说字体尺寸为10的高度,您现在知道您需要10 x 10 == 100像素,因此您的文本方面应为400x100

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top