如何在blackberry中计算Labelfield和HorizontalFieldmanager高度

如何在blackberry中计算Labelfield和HorizontalFieldmanager高度,blackberry,height,field,labelfield,Blackberry,Height,Field,Labelfield,我有HorizontalFieldManager,VerticalFieldManager和LabelFieldLabelField放在HorizontalFieldManager中,多个HorizontalFieldManager放在VerticalFieldManager中 当我尝试使用LabelField.getHeight()获取LabelField高度时;它返回0。如果Labelfield中有多行,它也会给我高度返回0。对于HorizontalFieldManager,我面临同样的问题

我有
HorizontalFieldManager
VerticalFieldManager
LabelField
LabelField
放在
HorizontalFieldManager
中,多个
HorizontalFieldManager
放在
VerticalFieldManager

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

到达高度后,我要计算垂直字段管理器的高度,并为屏幕动态设置高度


如何计算Label或Horizontalfieldmanager的高度?

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


这应该适合您使用
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(); 
    }
public int getPreferredHeight(){
String text=getText();
int maxWidth=getManager().getPreferredWidth();
int spaceAdvance=getFont().getAdvance(“”);
String[]words=StringUtilities.StringToWord(文本);
int lastWordAdvance=0;
int行=1;
for(int i=0;i
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(); 
    }
public int getPreferredHeight(){
String text=getText();
int maxWidth=getManager().getPreferredWidth();
int spaceAdvance=getFont().getAdvance(“”);
String[]words=StringUtilities.StringToWord(文本);
int lastWordAdvance=0;
int行=1;
for(int i=0;i
如果您可以将关于LabelField大小的决定权保留到布局完成后,那么您将从getHeight()准确地获得它。这意味着您实际上可以得到正确的结果,包括在LabelField的任何边距或填充中进行分解,我认为

int maxWidth=getManager().getPreferredWidth();
我会错过的

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

也可以在sublayout()中使用如下逻辑:

super.sublayout(…);
if(myField.getHeight()<100){
setMargin((100-myField.getHeight())/2,0,(100-myField.getHeight())/2,0);
超级。次级布局(…);
}

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

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

int maxWidth=getManager().getPreferredWidth();
我会错过的

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

也可以在sublayout()中使用如下逻辑:

super.sublayout(…);
if(myField.getHeight()<100){
setMargin((100-myField.getHeight())/2,0,(100-myField.getHeight())/2,0);
超级。次级布局(…);
}
这不是一个适合生产的示例