我有HorizontalFieldManager,VerticalFieldManager和LabelField。放置在HorizontalFieldManager中的LabelField和放置在VerticalFieldManager中的多个HorizontalFieldManager。
当我尝试使用labelfield.getHeight()获取LabelField高度时,它返回0。如果在Labelfield中有多行,它也会返回高度0。我在HorizontalFieldManager上也面临着同样的问题。
在获得高度后,我想要计算VerticalFieldManager高度,并为屏幕动态设置高度。
如何计算Label或Horizontalfieldmanager的高度?
发布于 2011-11-04 04:06:44
使用labelField.getPreferredHeight()和manager.getPreferredHeight()而不是labelField.getHeight()
这对你来说应该是可行的
发布于 2013-08-08 16:44:48
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();
}发布于 2013-08-09 17:25:32
如果您可以在布局之后再决定LabelField的大小,那么您将从getHeight()中准确地获得它。这意味着您实际上可以获得正确的结果,包括分解LabelField的任何边距或填充,我认为
int maxWidth = getManager().getPreferredWidth();会打偏的。
最初,这似乎相当困难,因为通常在将Field添加到屏幕时知道高度是很好的。但一般原则是,您应该在Manager的子布局中执行此操作,因此您只需移动依赖于高度的代码,在此过程中稍晚一点。这样做的好处是布局是动态的,所以如果LabelField的文本被更改,那么布局将被调用,依赖于高度的代码也将被重新调用。
也可以在sublayout()中使用这样的逻辑:
super.sublayout(...);
if (myField.getHeight() < 100 ) {
myField.setMargin((100 - myField.getHeight())/2, 0, (100 - myField.getHeight())/2, 0);
super.sublayout(...);
}这不是一个适合生产的示例,不建议对像素高度进行硬编码。这只是一个容易理解的例子……
https://stackoverflow.com/questions/8000272
复制相似问题