Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/395.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将零部件的可见性绑定到模型状态_Java_Data Binding_Vaadin_Vaadin14 - Fatal编程技术网

Java 如何将零部件的可见性绑定到模型状态

Java 如何将零部件的可见性绑定到模型状态,java,data-binding,vaadin,vaadin14,Java,Data Binding,Vaadin,Vaadin14,假设我有一个包含一些项目的网格和一个specialActionButton,我只想在网格中选择的项目具有特殊类型时显示它 或者我想禁用一个按钮,直到满足模型上的某些条件 目前,我正在考虑一个不可见的字段,它绑定了一个假验证器,用于进行UI更新 但这似乎是一种很糟糕的方法,我几乎可以肯定肯定一定有更好的方法。您应该能够使用ComponentRender实现这种行为。 请看下面的一个示例:。 您可以返回禁用/启用按钮,而不是图标 例如,类似这样的内容: grid.addColumnnew Compo

假设我有一个包含一些项目的网格和一个specialActionButton,我只想在网格中选择的项目具有特殊类型时显示它

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

目前,我正在考虑一个不可见的字段,它绑定了一个假验证器,用于进行UI更新


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

您应该能够使用ComponentRender实现这种行为。 请看下面的一个示例:。 您可以返回禁用/启用按钮,而不是图标

例如,类似这样的内容:

grid.addColumnnew ComponentRenderProperty->{ NativeButton=新的NativeButton删除; 如果property.getValue.contains1{ 返回按钮; }否则{ button.setEnabledfalse; 返回按钮; } }.setHeaderbutton; 更新项目并调用dataProvider.refreshItemitem后;启用的属性将更改


另一种方法是使用setClassNameGenerator。遗憾的是,文档中没有示例,但除了导入样式的方式外,此线程非常相关:

您应该能够使用ComponentRender实现行为。 请看下面的一个示例:。 您可以返回禁用/启用按钮,而不是图标

例如,类似这样的内容:

grid.addColumnnew ComponentRenderProperty->{ NativeButton=新的NativeButton删除; 如果property.getValue.contains1{ 返回按钮; }否则{ button.setEnabledfalse; 返回按钮; } }.setHeaderbutton; 更新项目并调用dataProvider.refreshItemitem后;启用的属性将更改

另一种方法是使用setClassNameGenerator。不幸的是,文档中没有示例,但除了导入样式的方式外,此线程非常相关:

情况1:按钮在网格之外 您可以在网格上定义SelectionListener,从中可以检查所选项目的条件。根据该结果,您可以调用button.setVisibleitemFulfillsCriteria

情况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:没有网格,只有活页夹 当您有活页夹并希望基于绑定项值显示/隐藏或启用/禁用组件时,可以在活页夹本身上定义ValueChangeListener。当绑定inputfield的值发生变化时,该侦听器将被触发,然后您可以检查绑定项现在是否满足您的条件并相应地采取行动

binder.addValueChangeListener(changeEvent -> {
    MyItem boundItem = binder.getBean();
    button.setVisible(boundItem.getFoo() == Foo.BAR);
    //button.setEnabled(boundItem.getFoo() == Foo.BAR);
}
情况1:按钮在网格之外 您可以在网格上定义SelectionListener,从中可以检查所选项目的条件。根据该结果,您可以调用button.setVisibleitemFulfillsCriteria

情况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:没有网格,只有活页夹 当您有活页夹并希望基于绑定项值显示/隐藏或启用/禁用组件时,可以在活页夹本身上定义ValueChangeListener。当绑定inputfield的值发生变化时,该侦听器将被触发,然后您可以检查绑定项现在是否满足您的条件并相应地采取行动

binder.addValueChangeListener(changeEvent -> {
    MyItem boundItem = binder.getBean();
    button.setVisible(boundItem.getFoo() == Foo.BAR);
    //button.setEnabled(boundItem.getFoo() == Foo.BAR);
}

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


对于一般方法,您可能会感兴趣。请注意,本文中的方法是实验性的,而不是Vaadin官方产品的一部分。

如果您希望按钮的禁用状态由模型中的布尔属性控制,则必须在布尔值发生更改时通知它


对于一般方法,您可能会感兴趣。请注意,本文中的方法是实验性的,而不是Vaadin官方产品的一部分。

非常感谢。但是,尽管这无疑是有用的,但问题不止于此,因此重新措辞是错误的:或者我想禁用一个按钮,直到满足模型上的某些条件。任何布尔条件,不一定与选择绑定。@User1291如果要禁用按钮而不是隐藏,只需将button.setVisibleshowButton更改为button.setEnabledshowButton即可。我在回答中加了这个。你误解我了。。。我想禁用基于模型中布尔值的按钮。如果布尔值为true,则按钮应启用/可见;如果布尔值为false,则按钮应禁用/隐藏;如果布尔值更改,则
用户界面应该相应地改变。这里没有选择。您的按钮是UI上的某个按钮还是网格列中的某个按钮?如果它是一个随机按钮,你能使用网格选择侦听器来更改它的enable属性吗?@User1291你的问题真的很简单,没有太多解释。现在你似乎在问两个不同的问题?无论如何,从你上次的评论来看,我想你是在问当你使用活页夹时该怎么做。我在回答中为此添加了一节。下一次,请在写问题时多花些时间,把你想问的问题弄清楚。谢谢。但是,尽管这无疑是有用的,但问题不止于此,因此重新措辞是错误的:或者我想禁用一个按钮,直到满足模型上的某些条件。任何布尔条件,不一定与选择绑定。@User1291如果要禁用按钮而不是隐藏,只需将button.setVisibleshowButton更改为button.setEnabledshowButton即可。我在回答中加了这个。你误解我了。。。我想禁用基于模型中布尔值的按钮。如果布尔值为true,则按钮应启用/可见;如果布尔值为false,则按钮应禁用/隐藏;如果布尔值更改,则UI应相应更改。这里没有选择。您的按钮是UI上的某个按钮还是网格列中的某个按钮?如果它是一个随机按钮,你能使用网格选择侦听器来更改它的enable属性吗?@User1291你的问题真的很简单,没有太多解释。现在你似乎在问两个不同的问题?无论如何,从你上次的评论来看,我想你是在问当你使用活页夹时该怎么做。我在回答中为此添加了一节。下一次,请在写问题时多花些时间,把你想问的问题弄清楚。你的问题引起了一些混乱。我建议您添加一个带有代码的简单示例进行演示。您的问题引起了一些混乱。我建议您添加一个带有代码的简单示例进行演示。