【问题标题】:JavaFX - remove selected item from other comboboxesJavaFX - 从其他组合框中删除选定的项目
【发布时间】:2018-05-24 20:40:47
【问题描述】:

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

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

});

到目前为止效果很好,但是当用户更改他对第一个组合框的选择时,先前删除的项目显然在所有其他组合框中都消失了。此外,如果用户一个接一个地选择第一个组合框中的每个人,那么其他每个组合框都会在一段时间后为空。

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

感谢任何帮助!提前致谢。

【问题讨论】:

    标签: java javafx combobox


    【解决方案1】:

    是的,当您在初始 ComboBox 中选择一个新项目时,您可以将已删除的项目重新添加到删除它的位置。

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

    当你点击 ComboBox 的 change 事件时,你首先从其他 ComboBoxes 中删除一个新选择的项目,检查之前选择的项目是否在那些 ComboBoxes 中,如果没有,将其添加到那里。

    例子:

            @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 是触发更改事件信号的组合框。

    因此,对于所有其他组合框,我删除了选定的值,检查这是否是项目的第一个选择 (oldValue != null) 或者我是否正在重新选择。如果它是第一个选择,则什么都不做,因此只会在其他 ComboBoxes 中发生删除。如果不是,则检查之前的项目是否真的已从其他 ComboBox 中删除,如果是,请重新添加。

    这种方法的一个缺点是,如果您在其中重新添加项目的 ComboBoxes 中的列表最初已排序,则它们将变得未排序。但这已经是另一个故事了……

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-04-08
        • 1970-01-01
        • 1970-01-01
        • 2012-05-23
        • 1970-01-01
        • 2011-03-01
        • 1970-01-01
        相关资源
        最近更新 更多