1

我有HorizontalFieldManager和。放置在和多个放置在。VerticalFieldManagerLabelFieldLabelFieldHorizontalFieldManagerHorizontalFieldManagerVerticalFieldManager

当我尝试使用 labelfield.getHeight(); 获取 LabelField 高度时 它返回 0 。如果 Labelfield 中有多行,它也会给我高度返回 0。我面临同样的问题HorizontalFieldManager

到达那里高度后,我想计算VerticalFieldManager高度并为屏幕动态设置高度。

如何计算 Label 或 Horizo​​ntalfieldmanager 的高度?

4

3 回答 3

3

使用labelField.getPreferredHeight()manager.getPreferredHeight()不使用labelField.getHeight()

这应该适合你

于 2011-11-03T20:06:43.877 回答
2

Farid 建议使用该方法有点困难,因为您将需要 labelWidth。对于多行标签,此 labelWidth 可能与父管理器可用宽度或您设置的某些确切宽度不同,因为每行可能具有不同的宽度,具体取决于单词是否适合 maxWidth 或不适合。

注意:正如 Nate 在评论中指出的那样,为空格添加提前也是一个好主意。我修改了代码以包含它。

这是我用来克服这些问题的方法:

public int getPreferredHeight() {
        String text = getText();

        int maxWidth = getManager().getPreferredWidth();
        int spaceAdvance = getFont().getAdvance(' ');
        String[] words = StringUtilities.stringToWords(text);
        int lastWordAdvance = 0;
        int lines = 1;
        for (int i = 0; i < words.length; i++) {
            int wordAdvance = getFont().getAdvance(words[i]) + spaceAdvance;
            if (lastWordAdvance + wordAdvance < maxWidth ) {
                lastWordAdvance += wordAdvance;
            } else {
                lines++;
                lastWordAdvance = wordAdvance;
            }
        }
        return (int)lines * getFont().getHeight(); 
    }
于 2013-08-08T08:44:47.793 回答
1

如果您可以将有关 LabelField 的大小的决定留到布局之后,那么您将从 getHeight() 中准确地得到它。这意味着您实际上可以获得正确的结果,包括考虑到 LabelField 的任何边距或填充,我认为

int maxWidth = getManager().getPreferredWidth();

将错过。

最初这似乎很困难,因为通常最好在将字段添加到屏幕时知道高度。但一般原则是您应该在 Manager 的子布局中执行此操作,因此您只是在稍后的过程中移动依赖于高度的代码。这样做的好处是布局是动态的,因此如果 LabelField 的文本发生更改,则会调用布局,并且依赖于高度的代码也会重新调用。

也可以在 sublayout() 中使用这样的逻辑:

super.sublayout(...);

if (myField.getHeight() < 100 ) {

  myField.setMargin((100 - myField.getHeight())/2, 0, (100 - myField.getHeight())/2, 0);

  super.sublayout(...);

}

这不是一个适合生产的示例,不建议对像素高度进行硬编码。这只是一个容易理解的例子......

于 2013-08-09T09:25:32.470 回答