如何在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);
超级。次级布局(…);
}
这不是一个适合生产的示例