【问题标题】:GWT: How to get width of text in TextBox?GWT:如何在 TextBox 中获取文本的宽度?
【发布时间】:2015-01-06 10:55:27
【问题描述】:

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

我想要做的是调整文本大小,使其始终适合文本框。这就是为什么我需要文本的宽度来计算所需的字体大小。

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

【问题讨论】:

  • 你的意思是文本长度,对吧?
  • 不,我的意思是它的大小以像素为单位。
  • 为什么文本需要适合 TextBox 的大小?
  • 所以用户可以看到整个文本..当然必须有下限,但我从相当大的字体开始;)

标签: gwt input textbox


【解决方案1】:

我像Corvus 那样解决了这个问题,方法是引入一个额外的Label 元素并用CSS 隐藏它。我将文本从TextBox 复制到Label 并通过Label.getOffsetWidth() 检索宽度。

但是,我需要额外的代码来

  1. 正确处理重复的空格,
  2. 处理文本框的样式更改,以及
  3. 避免在用户键入时文本跳转。

我发现我可以通过调用来匹配样式

label.setStyleName(textBox.getStyleName() + " prewrap");

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

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

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      我会选择字符数乘以字母“m”的宽度,这是定义上限的经典方法。我绝不会批评你将要做什么,但我发现改变元素的形式在空间方面可能是有效的,但使用起来很糟糕。用户看到这里的文本框,然后加载数据,突然文本框移动了。用户已经花费时间重新检查表单以重新定位自己,重新建立一旦加载了新文本片段就会移动的地标。你已经用空间换了时间,在讨价还价中表现得更差。也许这不适用于您正在做的事情,但如果确实如此,请考虑一下。

      没有明显的方法来做你想做的事是有原因的。

      更新:

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

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

      【讨论】:

        【解决方案4】:

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

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

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

        要使 TextArea 看起来和感觉像单行 TextBox,您需要设置以下 css 属性:

        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 行)。

        【讨论】:

          【解决方案5】:

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

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

          【讨论】:

            猜你喜欢
            • 2013-01-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-12-17
            • 2021-03-24
            • 1970-01-01
            相关资源
            最近更新 更多