如何处置Composite对象的所有子节点?

时间:2012-05-25 23:28:24

标签: java swt dispose composite

我有一个

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);
当我解开它时,

为所有孩子工作......

2 个答案:

答案 0 :(得分: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();
    }

答案 1 :(得分:2)

当处理子节点(或数组中的任何东西)时,我使用for next循环但是从头到尾都是从头开始,而不是从头开始。 (并在循环之前得到长度或者它会改变。)

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

否则你会删除所有其他人。