JavaFX - 从其他组合框中删除所选项目

时间:2017-12-11 10:35:58

标签: java javafx combobox

我目前正在创建一个工具来为不同的事件提交报告。

在第一步中,用户选择参与呼叫的每个人(我们有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);
        }

});

到目前为止工作正常但是当用户更改他对第一个组合框的选择时,之前删除的项目显然在其他组合框中消失了。此外,如果用户一个接一个地选择第一个组合框中的每个人,则一段时间后每隔一个组合框将变空。

因此,我需要根据每个组合框的选定项目重新填充这些框,而不会丢失当前选定的项目或将所选项目重新添加回列表中。

任何帮助表示赞赏!提前谢谢。

2 个答案:

答案 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)

您使用的是哪个JDK版本?你有没有检查过最新的JDK? 我建议您在JDK 8u151JDK 9上查看您的问题。