移动列表框中的所有选定项目多个选择

时间:2014-09-25 11:55:12

标签: java gwt

我无法将列表框中的所有选定项目移动到第二个列表框,这是代码:

void moveIn(ListBox inMoveOut, ListBox inMoveIn) {
inMoveOut.setMultipleSelect(true);
inMoveIn.setMultipleSelect(true);
    // for each item in the listbox
    for (int i = 0; i < inMoveOut.getItemCount(); i++) {
        if (inMoveOut.isItemSelected(i)) {
            // add item from the first listbox to the second lsitbox
            inMoveIn.addItem(inMoveOut.getItemText(i), inMoveOut.getValue(i));
            // delete item from the first listbox
            inMoveOut.removeItem(i);
        }
    }

}

我可以选择多个项目,但只能移动一个项目,而不是所有选定的项目。请提出任何建议。

2 个答案:

答案 0 :(得分:1)

由于您要删除循环中的项目,因此您需要更改循环限制。如果你从最后开始并转到开头,这不重要:

int size = inMoveOut.getItemCount()
for (int i = size - 1; i >= 0 ; i--) {
    if (inMoveOut.isItemSelected(i)) {
        // add item from the first listbox to the second lsitbox
        inMoveIn.addItem(inMoveOut.getItemText(i), inMoveOut.getValue(i));
        // delete item from the first listbox
        inMoveOut.removeItem(i);
    }
}

然而,这将以相反的顺序添加它们。所以这是另一种选择:

// First, copy them across
for (int i = 0; i < inMoveOut.getItemCount(); i++) {
    if (inMoveOut.isItemSelected(i)) {
        // add item from the first listbox to the second lsitbox
        inMoveIn.addItem(inMoveOut.getItemText(i), inMoveOut.getValue(i));
    }
}

// Then delete them
for (int i = 0; i < inMoveOut.getItemCount(); i++) {
    if (inMoveOut.isItemSelected(i)) {
        // delete item from the first listbox
        inMoveOut.removeItem(i);
    }
}

效率稍低,但它会完成这项工作。

答案 1 :(得分:0)

假设在第一次迭代中,该项目是从&#39; inMoveOut&#39; to&#39; inMoveIn&#39;,但是,当行inMoveOut.removeItem(i)执行时, ListBox的大小已更改, (即,inMoveOut.getItemCount()现在具有不同的值),并且您的“循环”#39;仍将迭代inMoveOut.getItemCount()次,实际上是旧项目计数。

我认为这可能是原因。

您可以留意'foreach&#39;有点像东西,所以你摆脱了索引和提取项目。

for(ListBox item: inMoveOut)
{
// logic here
}