我需要确定Google Web Toolkit中TextBox中文本的宽度。
我有一个比例字体,所以我不能只使用像getText().length() * characterWidth
这样的东西。
我要做的是调整文本大小,使其始终适合TextBox。这就是我需要文本宽度来计算所需字体大小的原因。
我能想到的唯一解决方案是制作我使用的字体宽度的地图,并计算文本的宽度,作为各个字符宽度的总和。
答案 0 :(得分:3)
我通过引入一个额外的Label
元素并用CSS隐藏它来解决Corvus所做的问题。我将文本从TextBox
复制到Label
,然后按Label.getOffsetWidth()
检索宽度。
但是,我需要额外的代码
我发现我可以通过调用
来匹配样式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行)。