假设我有 aGrid
包含一些Item
s 和 aspecialActionButton
我只想在选择的项目时显示grid
has type special
。
或者我想禁用一个按钮,直到满足模型上的某些条件。
目前,我正在考虑一个不可见的字段,该字段与一个Validator
用于 UI 更新的假货绑定。
但这似乎是一种糟糕的方法,我几乎可以肯定一定有更好的方法。
假设我有 aGrid
包含一些Item
s 和 aspecialActionButton
我只想在选择的项目时显示grid
has type special
。
或者我想禁用一个按钮,直到满足模型上的某些条件。
目前,我正在考虑一个不可见的字段,该字段与一个Validator
用于 UI 更新的假货绑定。
但这似乎是一种糟糕的方法,我几乎可以肯定一定有更好的方法。
情况1:按钮在网格之外
您可以在网格上定义一个SelectionListener
,您可以在其中检查所选项目的条件。根据该结果,您调用button.setVisible(itemFulfillsCriteria);
// assuming a single select grid
grid.addSelectionListener(selection -> {
boolean showButton = false;
MyItem selectedItem = selection.getFirstSelectedItem().orElse(null);
if(selectedItem != null && selectedItem.getFoo() == Foo.BAR){ // show button only if item.foo == BAR
showButton = true;
}
myButton.setVisible(showButton);
//myButton.setEnabled(showButton); // if you want to disable instead of hide.
}
情况 2:每个网格行的按钮
当您为此按钮添加列时,您可以在渲染器内部检查该项目是否符合让该按钮可见的条件。
grid.addComponentColumn(item -> {
if(item.getFoo() == Foo.BAR) {
return new Button("click me", click -> {
// do something when clicked
});
} else {
return new Span(); // don't return null, as that would cause exception. Instead, return empty Span.
}
})
.setKey("someAction")
.setHeader("Do the thing");
情况 3:没有网格,但是 aBinder
当你有一个活页夹并且想要根据绑定的项目值显示/隐藏或启用/禁用组件时,你可以ValueChangeListener
在活页夹本身上定义一个。每当绑定输入字段的值发生更改时,都会触发该侦听器,然后您可以检查绑定项目现在是否满足您的条件并采取相应措施。
binder.addValueChangeListener(changeEvent -> {
MyItem boundItem = binder.getBean();
button.setVisible(boundItem.getFoo() == Foo.BAR);
//button.setEnabled(boundItem.getFoo() == Foo.BAR);
}
您应该能够使用ComponentRender
. 看看这里的一个例子:使用组件渲染器。而不是Icon
您可以返回禁用/启用按钮。
例如,像这样:
grid.addColumn(new ComponentRenderer<>(property -> {
NativeButton button=new NativeButton("Remove");
if (property.getValue().contains("1")) {
return button;
} else {
button.setEnabled(false);
return button;
}
})).setHeader("button");
一旦您更新项目并调用dataProvider.refreshItem(item);
enabled 属性将更改
另一种方法是使用setClassNameGenerator
. 不幸的是,在文档中没有示例,但是(除了导入样式的方式)这个线程非常相关:How to set color of cell in Grid in Vaadin 13?
如果您希望例如按钮的禁用状态由模型中的布尔属性控制,则必须以某种方式在布尔值更改时通知它。
对于通用方法,您可能对 Java 组件的视图模型感兴趣。请注意,本文中的方法是实验性的,不是 Vaadin 官方产品的一部分。