首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何计算blackberry中的Labelfield和HorizontalFieldmanager高度

如何计算blackberry中的Labelfield和HorizontalFieldmanager高度
EN

Stack Overflow用户
提问于 2011-11-04 02:46:19
回答 3查看 859关注 0票数 1

我有HorizontalFieldManagerVerticalFieldManagerLabelField。放置在HorizontalFieldManager中的LabelField和放置在VerticalFieldManager中的多个HorizontalFieldManager

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

在获得高度后,我想要计算VerticalFieldManager高度,并为屏幕动态设置高度。

如何计算Label或Horizontalfieldmanager的高度?

EN

回答 3

Stack Overflow用户

发布于 2011-11-04 04:06:44

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

这对你来说应该是可行的

票数 3
EN

Stack Overflow用户

发布于 2013-08-08 16:44:48

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

注意:正如Nate在评论中指出的那样,增加空格的预付款也是一个好主意。我修改了代码以包括这一点。

以下是我用来解决这些问题的方法:

代码语言:javascript
复制
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(); 
    }
票数 2
EN

Stack Overflow用户

发布于 2013-08-09 17:25:32

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

代码语言:javascript
复制
int maxWidth = getManager().getPreferredWidth();

会打偏的。

最初,这似乎相当困难,因为通常在将Field添加到屏幕时知道高度是很好的。但一般原则是,您应该在Manager的子布局中执行此操作,因此您只需移动依赖于高度的代码,在此过程中稍晚一点。这样做的好处是布局是动态的,所以如果LabelField的文本被更改,那么布局将被调用,依赖于高度的代码也将被重新调用。

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

代码语言:javascript
复制
super.sublayout(...);

if (myField.getHeight() < 100 ) {

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

  super.sublayout(...);

}

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8000272

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档