我有一个
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);
当我解开它时,为所有孩子工作......
答案 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--
否则你会删除所有其他人。