我目前正在创建一个工具来为不同的事件提交报告。
在第一步中,用户选择参与呼叫的每个人(我们有26人的工作人员)。在下一步中,每个选定的人被写入6个不同的组合框,以便用户可以选择每辆车的驾驶员和指挥官(3辆车 - 每辆车上的指挥官和司机,因此有6个组合框)。
我的问题是:我需要防止在每个车辆上选择同一个人作为驱动程序,或同时选择驱动程序和指挥官。因此,我尝试通过ChangeListener从所有其他组合框中删除所选人员:
(每个组合框都有一个ChangeListener,这里有一个例子)
inputDriverTruck42.getSelectionModel().selectedItemProperty().addListener(new ChangeListener() {
@Override
public void changed(ObservableValue ov, Object t, Object t1) {
String toRemove = inputDriverTruck42.getSelectionModel().getSelectedItem();
inputDriverCar19.getItems().remove(toRemove);
inputDriverTruck33.getItems().remove(toRemove);
inputCommanderCar19.getItems().remove(toRemove);
inputCommanderTruck42.getItems().remove(toRemove);
inputCommanderTruck33.getItems().remove(toRemove);
}
});
到目前为止工作正常但是当用户更改他对第一个组合框的选择时,之前删除的项目显然在其他组合框中消失了。此外,如果用户一个接一个地选择第一个组合框中的每个人,则一段时间后每隔一个组合框将变空。
因此,我需要根据每个组合框的选定项目重新填充这些框,而不会丢失当前选定的项目或将所选项目重新添加回列表中。
任何帮助表示赞赏!提前谢谢。
答案 0 :(得分:0)
是的,当您在初始ComboBox中选择新项目时,可以将其从列表中重新添加到列表中。
从其他列表中删除的项目实际上是第一个ComboBox中当前选择的项目。当您在同一组合框中选择其他值时,先前选择的值将保存在oldValue变量中(在您的情况下,它是Object t
中的public void changed(ObservableValue ov, Object t, Object t1))
。
当您击中ComboBox的change事件时,首先要从其他ComboBox中删除一个新选择的项目,检查先前选择的项目是否在那些ComboBox中,否则请在其中添加它。
示例:
@Override
public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue)
{
List<ComboBox<String>> groupedComboBoxes = comboBoxesMap.get(this.comboBoxGroupName);
groupedComboBoxes.stream().filter(comboBox -> !comboBox.equals(this.currentComboBox)).forEach(comboBox ->
{
comboBox.getItems().remove(newValue);
if (oldValue != null && !comboBox.getItems().contains(oldValue))
comboBox.getItems().add(oldValue);
});
}
其中groupedComboBoxes
是将要在其中删除/添加项目的组合ComboBox的列表,this.currentComboBox
是一个命中更改事件信号的ComboBox。
因此,对于所有其他组合框,我都删除了选定的值,请检查这是该项目(oldValue != null
)的第一个选择,还是我正在重新选择。如果是第一选择,则什么也不做,因此在其他ComboBox中只会进行删除。如果不是,请检查以前的项目是否真的从其他ComboBox中删除了,如果是这种情况,请重新添加回去。
此方法的一个缺点是,如果要对它们进行重新排序,则要在其中重新添加项的ComboBoxes中的列表将变得未排序。但这已经是另一个故事了……
答案 1 :(得分:-1)