1

假设我有 aGrid包含一些Items 和 aspecialActionButton我只想在选择的项目时显示gridhas type special

或者我想禁用一个按钮,直到满足模型上的某些条件。

目前,我正在考虑一个不可见的字段,该字段与一个Validator用于 UI 更新的假货绑定。

但这似乎是一种糟糕的方法,我几乎可以肯定一定有更好的方法。

4

3 回答 3

2

情况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);
}
于 2020-03-02T10:49:21.543 回答
2

您应该能够使用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?

于 2020-03-02T10:30:16.687 回答
2

如果您希望例如按钮的禁用状态由模型中的布尔属性控制,则必须以某种方式在布尔值更改时通知它。

对于通用方法,您可能对 Java 组件的视图模型感兴趣。请注意,本文中的方法是实验性的,不是 Vaadin 官方产品的一部分。

于 2020-03-02T11:53:31.413 回答