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);
}
最后的问题
最终,我希望保留菜单管理器的自定义布局,同时允许重画字段元素。以下是我最后的问题:

  • 你以前有过这种经历吗

  • 在屏幕上添加/删除字段元素时,菜单管理器为什么会以错误的顺序开始绘图

  • 本机Manager.sublayout()是否执行了我不想维护绘图顺序的操作


  • 我没有看到你描述的行为,但下面这句话有点令人不安:

    // 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())