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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JavaFX - 从其他组合框中删除所选项目相关的知识,希望对你有一定的参考价值。

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

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

});

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

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

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

答案

是的,当您在初始ComboBox中选择新项目时,可以将删除的项目重新添加到列表中。

从其他列表中删除的项目实际上是您在第一个ComboBox中选择的项目。当您在同一个ComboBox中选择其他值时,您之前选择的值将保存在oldValue变量中(在您的情况下,它是Object t中的public void changed(ObservableValue ov, Object t, Object t1)))。

当您点击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是我们要删除/添加项目的分组组合框列表,this.currentComboBox是一个命中变更事件信号的ComboBox。

因此,对于所有其他组合框我删除所选值,检查这是否是项目的第一个选择(oldValue != null)或者我是否重新选择。如果它是第一个选择,则不执行任何操作,因此仅在其他ComboBox中执行删除操作。如果不是,则检查先前的项目是否已从其他ComboBox中删除,如果是这种情况,请重新添加。

这种方法的一个缺点是,您重新添加项目的ComboBox中的列表将在最初排序时变为未排序。但那已经是另一个故事......

另一答案

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

以上是关于JavaFX - 从其他组合框中删除所选项目的主要内容,如果未能解决你的问题,请参考以下文章

组合框多选以在 Access 2016 中的文本框中显示所选项目

如何从我的SQL SERVER获取我的数据库列表,并使用javafx将其添加到组合框中

Csharp:根据组合框中的值加载选中的项目列表

如何从 Java 的组合框中删除特定项目?

删除所选项目列表框AS3

组合框占位符 NullPointerException JavaFX