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 8u151,JDK 9上查看你的问题。
以上是关于JavaFX - 从其他组合框中删除所选项目的主要内容,如果未能解决你的问题,请参考以下文章
组合框多选以在 Access 2016 中的文本框中显示所选项目