如何计算Labelfield和HorizontalFieldmanager在黑莓高度



我有HorizontalFieldManager, VerticalFieldManagerLabelFieldLabelField放在HorizontalFieldManager中,多个HorizontalFieldManager放在VerticalFieldManager中。

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

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

我如何计算标签或Horizontalfieldmanager的高度?

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

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

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

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

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(); 
    }

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

int maxWidth = getManager().getPreferredWidth();

将小姐。

一开始这似乎很困难,因为当您向屏幕添加字段时,通常最好知道高度。但一般的原则是你应该在管理器的子布局中这样做,所以你只是移动依赖于高度的代码,在这个过程的后期。这样做的好处是布局是动态的,所以如果LabelField的文本被改变,那么布局将被调用,而依赖于高度的代码也会被重新调用。

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

super.sublayout(...);
if (myField.getHeight() < 100 ) {
  myField.setMargin((100 - myField.getHeight())/2, 0, (100 - myField.getHeight())/2, 0);
  super.sublayout(...);
}

这不是一个适合制作的例子,不建议硬编码像素高度。这只是一个容易理解的例子....

相关内容

  • 没有找到相关文章

最新更新