【发布时间】:2018-04-05 05:01:26
【问题描述】:
我的可编辑Grid 中有两个ComboBoxes,其中第二个ComboBox 基于第一个。因此,例如,您将拥有汽车制造商,然后是汽车模型。当您更改 make 组合框时,模型组合框也会相应更改。
考虑到这一点,我有:
ComboBox<String> makeComboBox = new ComboBox<String>();
ComboBox<String> modelComboBox = new ComboBox<String>();
具体来说:
grid.addColumn(CarRental::getPerson)
.setEditorBinding(binder.forField(personComboxBox).bind(CarRental::getPerson, CarRental::setPerson));
grid.addColumn(CarRental::getMake)
.setEditorBinding(binder.forField(makeComboxBox).bind(CarRental::getMake, CarRental::setMake));
grid.addColumn(CarRental::getModel)
.setEditorBinding(binder.forField(modelComboxBox).bind(CarRental::getModel, CarRental::setModel));
这里的关键是,如果 makeComboBox 改变了,我希望 modelComboBox 也改变。换句话说,如果您选择 Honda,那么我希望模型 ComboBox 更改为 Fit、Civic、Accord 等。为此我添加了一个SelectionListener(但也可以是ValueChangeListener,没关系,效果还是一样的)。
特别是我有:
makeComboBox.addSelectionListener(event ->
{
modelComboBox.clear();
modelComboBox.setItems(getModelsBasedOnMake(makeComboBox.getValue()));
// Assuming someone has just edited the make value,
// say changed from Toyota to Honda, then I want the model selected to be empty
});
因为 ComboBox 可以不同,所以我是 ve added some logic to update the components on theOpenListenerfor the Grid Editor。具体来说:
grid.getEditor().addOpenListener(open ->
{
...
CarRental selectedCarRental = (CarRental)event.getBean();
makeComboBox.setItems(makeList);
modelComboBox.setItems(getModelsBasedOnMake(carRental.getMake()));
});
这里的问题是modelComBoxbox 倾向于被取消选择,因为如果你查看它,因为存在冲突,所以无法保证它会是哪个值。
我查看了暂时禁用 selectionListener ,但所有删除侦听器都已被 Vaadin 8 弃用。因此,我如何设置网格以便能够在网格中编辑汽车品牌和型号?
【问题讨论】:
-
当使用相关的 ValueChangeListeners 更新许多字段时,我一直在使用成员字段
isLoading在其他侦听器中进行检查,以便他们知道什么时候不应该做任何事情。这种方法对您也有帮助吗? -
"但是所有删除侦听器都已被 Vaadin 8 弃用" ->
add*Listener方法返回一个类型为Registration的对象,该对象具有一个方法remove。这就是你的意思吗?
标签: java vaadin vaadin8 vaadin-grid