代码之家  ›  专栏  ›  技术社区  ›  Nate W.

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

  •  12
  • Nate W.  · 技术社区  · 14 年前

    在我能找到的所有例子中 JTextArea 文本区 ,如果 文本区 JScrollPane . 很明显 文本区

    现在,我的情况要求我不使用 滚动面板 ,但是 文本区 文本区

    作为补充说明 文本区 JPanel 它没有布局管理器-它使用基于所添加组件的首选大小的绝对定位。这需要我 文本区 getPreferredSize() . 正确的尺寸应该是我在构建它时提供的宽度,以及用提供的宽度显示所有文本所需的最小高度。

    我发现了一些类似的线程,它们讨论了 有时通过打电话来解决 pack() 在父容器上两次。这不是我的选择。我很想创造自己的 这需要一个宽度和字符串,并根据宽度和字体设置计算出所需的最小高度,但我想在花时间做这件事之前我会先询问一下。

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

    4 回复  |  直到 14 年前
        1
  •  5
  •   camickr    14 年前

    它使用基于所添加组件的首选大小的绝对定位。

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

    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
  •  5
  •   Andrew Thompson    13 年前
    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);
        }
    }
    
        3
  •  0
  •   pvbemmelen62    13 年前

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

    invalid integer: i<0 not allowed , < 必须转义(编码?),否则JLabel将无法解释html。

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

        4
  •  -1
  •   DaneAU    14 年前

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

    假设您的文本有1000个字符(包括空格),并且字符的宽度相当于4个像素,那么您可以计算出宽度是否为400,即每行100个字符,然后您将需要10行。现在假设字体大小的高度是10,你现在知道你需要10 x 10==100像素,所以你的文本区域应该是400x 100