1

我有一个

Composite descComp

里面有一些东西......基本上它是一个表单的容器,由许多标签、组合和按钮组成,所有这些都排成一行。我的表单不是有限的,我有一个按钮,可以添加一行额外的输入。然而,为了让它工作,我必须处理我的 descComp 的老孩子......

private void populateConstantMain(ContentData tariffConstantsOfType, Composite descComp,GridLayout descCompLayout, Boolean resize) {

    int arraySize;

    if (resize == false) {
        arraySize = tariffConstantsOfType.getQueryRowCount();
    } else {
        for (int i = 0 ; i < descComp.getChildren().length; i++) {
            System.out.println("Disposing: " + i + " " + descComp.getChildren()[i].toString());
            //descComp.getChildren()[i].setEnabled(false);
            descComp.getChildren()[i].dispose();
        }
        arraySize = tariffConstantsOfType.getQueryRowCount() + 1;
    }
......
}

由于某些原因

descComp.getChildren()[i].dispose();

不起作用,这意味着它不会处理所有孩子,这会导致插入新孩子时出错,从而破坏布局:/有趣的是

descComp.getChildren()[i].setEnabled(false);

工作,当我取消它,为所有孩子...

4

2 回答 2

15

我有一种预感,在复合材料上调用 getChildren() 只会在您调用它时返回未处置的孩子。因此,当您的索引在增加但数组的大小正在减小时,调用descComp.getChildren()[i].dispose();会变得一团糟。你为什么不试试:

    for (Control control : descComp.getChildren()) {
        control.dispose();
    }

通过这种方式,您可以在开始处理每个子项之前获得合成中子项的静态视图。

我还切换了代码以使用更好的 J5 for-each 语法。如果你被困在 J1.4 上,那么不幸的是你需要坚持for(;;)循环:

    Control[] children = descComp.getChildren();
    for (int i = 0 ; i < children.length; i++) {
        children[i].dispose();
    }
于 2012-05-25T23:56:07.813 回答
2

在处理子项(或数组中的任何内容)时,我使用 for next 循环,但从头到尾进行,而不是从头到尾。(并在循环之前获取长度,否则它会改变。)

int i = length-1;i>=0;i--

否则你删除所有其他的。

于 2012-08-02T18:41:46.480 回答