如何创建具有指定宽度的JTextarea,并且显示所有文本所需的最小高度?
-
28-09-2019 - |
题
在所有可以找到使用的示例中 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 &" +
" (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