GWT:如何在TextBox中获取文本的宽度?

时间:2011-10-12 10:46:35

标签: gwt input textbox

我需要确定Google Web Toolkit中TextBox中文本的宽度。 我有一个比例字体,所以我不能只使用像getText().length() * characterWidth这样的东西。

我要做的是调整文本大小,使其始终适合TextBox。这就是我需要文本宽度来计算所需字体大小的原因。

我能想到的唯一解决方案是制作我使用的字体宽度的地图,并计算文本的宽度,作为各个字符宽度的总和。

5 个答案:

答案 0 :(得分:3)

我通过引入一个额外的Label元素并用CSS隐藏它来解决Corvus所做的问题。我将文本从TextBox复制到Label,然后按Label.getOffsetWidth()检索宽度。

但是,我需要额外的代码

  1. 正确处理重复空格,
  2. 在文本框中处理样式更改,
  3. 在用户输入时避免文本跳转。
  4. 我发现我可以通过调用

    来匹配样式
    label.setStyleName(textBox.getStyleName() + " prewrap");
    

    上述语句中引用的预包装样式必须在某处定义为

    .prewrap { white-space: pre-wrap; }
    

    这个额外的样式是必需的,因为文本框的内置样式包含pre-wrap指令,该指令不会出现在textbox.getStyleName()返回的样式列表中。

    在计算宽度时,我还在标签文本字符串的末尾添加了两个空格,以便在用户输入时文本不会来回跳跃。

答案 1 :(得分:2)

我会用字符数乘以字母“m”的宽度,这是定义上限的经典方法。我很难批评你将会做什么,但我发现转换元素的形式在空间方面可能是有效的,但使用起来可怕。用户在此处看到文本框,然后加载数据,突然文本框已移动。用户花费时间重新检查表格以再次定位自己,重新建立一旦加载新文本后将要移动的地标。你有时间交易空间,而且讨价还价更差。也许这不适用于您正在做的事情,但如果确实如此,请考虑它。

为什么没有明显的方法可以做你想做的事。

更新

来自corvus:“所以用户可以看到整个文本..当然必须有下限,但我从相当高的字体大小开始;) - ”

啊,好的。关于此的一些想法。据推测,无论如何,您的数据字段在大小方面都有一个上限。说80个字符。由于我上面给出的原因,该大小的固定字段比来回捕捉的字段要好。但也知道一行文字的“正确”长度约为60个字符左右。这可以追溯到古腾堡数百年的排版经验。即使这只是平均值,您也可以点击a detailed heuristic for estimating the ideal line length的此链接。如果用户要与之交互的文本(读取或输入)超过60个字符(或您确定的任何理想行长度),那么您可能需要使用多行TextArea。

答案 2 :(得分:2)

我通过引入额外的Label元素并用CSS隐藏它来解决了这个问题。我将文本从TextBox复制到Label,然后按Label.getOffsetWidth()检索宽度。

我并不为这个解决方案感到自豪,但是嘿,它有效。

答案 3 :(得分:0)

Altough我不确定你为什么要这样做,但我可以说没有真正的,可靠的解决方案。您可以像@Steve J建议的那样使用启发式方法,但是您将无法计算文本的确切大小。

我只会告诉你为什么你的解决方案不起作用。如果在用户自己的样式表中声明为!important的字体样式,大小等怎么办?

答案 4 :(得分:0)

您可以使用TextArea而不是TextBox,并使用其滚动宽度(textArea.getElement().getScrollWidth())来确定文本的宽度,只要它比文本区域宽。

缺点:如果文本适合它,滚动宽度不会低于文本区域的偏移宽度!

作为一种解决方法,您可以增加字体大小,测试文本是否超出文本区域宽度,并坚持使用旧字体大小。我不知道,如果有更直接的方式......

使TextArea看起来&感觉就像你需要设置以下css属性的单行TextBox:

overflow: hidden; // get rid of scrollbars

resize: none; // get rid of resize triangle

并设置(无css)属性:

wrap="off" // css "white-space: nowrap;" not working here

最后但并非最不重要的是将高度调整为单行高度(默认高度为2或3行)。