User interface Blackberry--更新屏幕更改manager及其字段元素的绘图顺序
场景User interface Blackberry--更新屏幕更改manager及其字段元素的绘图顺序,user-interface,layout,blackberry,repaint,User Interface,Layout,Blackberry,Repaint,场景 在一个屏幕中,我有两个管理器:1)顶部的菜单管理器和2)具有信息/按钮元素的主体管理器。菜单管理器进行自定义绘图,以便其菜单元素(LabelFields)的间距适当 核心问题-经理和子字段绘图顺序 屏幕显示良好,除非用户执行操作(单击按钮),导致添加/删除body manager的元素。一旦在主体中添加/删除字段元素,菜单的绘制顺序就会混淆 当主体管理器添加或删除字段时,菜单管理器开始绘制其子元素,然后再绘制其子元素(标签字段),而不是绘制其自身;因此,在标签字段的顶部进行绘制,使它们看起
在一个屏幕中,我有两个管理器:1)顶部的菜单管理器和2)具有信息/按钮元素的主体管理器。菜单管理器进行自定义绘图,以便其菜单元素(LabelFields)的间距适当 核心问题-经理和子字段绘图顺序 屏幕显示良好,除非用户执行操作(单击按钮),导致添加/删除body manager的元素。一旦在主体中添加/删除字段元素,菜单的绘制顺序就会混淆 当主体管理器添加或删除字段时,菜单管理器开始绘制其子元素,然后再绘制其子元素(标签字段),而不是绘制其自身;因此,在标签字段的顶部进行绘制,使它们看起来好像已经消失了 评论
已经尝试了invalidate和其他选项--我尝试调用invalidate、invalidateall、updateDisplay。。。在主体中添加/删除字段元素后。一切都没有成功 删除自定义子布局是可行的——解决此问题的唯一方法是删除菜单管理器自定义子布局逻辑。不幸的是,菜单系统随后以传统方式绘制,并且没有提供足够的间距 下面是菜单管理器的子布局代码,我是否遗漏了什么
public void sublayout(int iWidth, int iHeight)
{
final int iNumFields = getFieldCount();
int maxHeight = 0;
final int segmentWidth = iWidth / iNumFields;
final int segmentWidthHalf = segmentWidth / 2;
for (int i = 0; i < iNumFields; i++)
{
final Item currentField = (Item)this.getField(i);
// 1. Use index to compute bounds of the field
final int xSegmentTrueCenter = segmentWidth * i + segmentWidthHalf;
// 2. center field inbetween bounds using field width (find fill width of text)
final int xFieldStart = xSegmentTrueCenter - currentField.getFont().getAdvance(currentField.getText())/2;
// set up position
setPositionChild(currentField, xFieldStart, getContentTop() + MenuAbstract.PADDING_VERTICAL);
// allow child to draw itself
layoutChild(currentField, iWidth, currentField.getHeight());
// compute max height of the field
//int fieldheight = currentField.getHeight();
maxHeight = currentField.getHeight() > maxHeight
? currentField.getHeight() + 2 * MenuAbstract.PADDING_VERTICAL
: maxHeight;
}
this.setExtent(iWidth, maxHeight);
}
public void子布局(int-iWidth,int-iHeight)
{
final int iNumFields=getFieldCount();
int maxHeight=0;
最终整数段宽度=iWidth/iNumFields;
最终整数分段宽度一半=分段宽度/2;
对于(int i=0;imaxHeight
?currentField.getHeight()+2*菜单abstract.PADDING\u垂直
:最大高度;
}
此.setExtent(iWidth,maxHeight);
}
最后的问题最终,我希望保留菜单管理器的自定义布局,同时允许重画字段元素。以下是我最后的问题:
我没有看到你描述的行为,但下面这句话有点令人不安:
// allow child to draw itself
layoutChild(currentField, iWidth, currentField.getHeight());
在字段通过layoutChild方法调用setExtent之前,getHeight()不应返回合理的值。虽然我希望它在所有情况下都会引起问题,但我不知道为什么第一次它会起作用。在您的逻辑中,我认为您可以安全地使用iHeight而不是该行中的currentField.getHeight()。该字段只会使其自身达到所需的大小-它不会使用所有iHeight,除非它类似于VerticalFieldManager在设置其范围之前,我同意AtariPete关于getHeight()有效性的看法。我建议尝试在layoutChild()调用中使用currentField.getPreferredHeight():
layoutChild(currentField,iWidth,currentField.getPreferredHeight())代码>