我有HorizontalFieldManager
,VerticalFieldManager
和LabelField
。放置在LabelField
中的HorizontalFieldManager
和多个HorizontalFieldManager
放置在VerticalFieldManager
。
当我尝试使用labelfield.getHeight()获取LabelField高度时;它返回0。如果在Labelfield中有多行,它也会给我高度返回0.同样的问题我正面临HorizontalFieldManager
。
到达高度后,我想计算VerticalFieldManager
高度并动态设置屏幕高度。
如何计算Label或Horizontalfieldmanager的高度?
答案 0 :(得分:3)
使用labelField.getPreferredHeight()
和manager.getPreferredHeight()
而不是labelField.getHeight()
这应该对你有用
答案 1 :(得分: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();
}
答案 2 :(得分: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(...);
}
这不是一个适合生产的例子,不推荐硬编码像素高度。这只是一个容易理解的例子......