gpt4 book ai didi

java - 有没有办法在可编辑的 Vaadin 8 网格中设置验证并编辑长值

转载 作者:太空宇宙 更新时间:2023-11-04 11:13:57 26 4
gpt4 key购买 nike

我有一个 Vaadin 8 网格,我想将其中一列设置为可编辑。为此,我有其中 Food.calories 是一个 long (是的,在这种情况下它可能是一个 int,但请记住这是一个示例,我的特定用例需要一个 long):

Binder<Food> binder = foodGrid.getEditor().getBinder();
TextField caloriesTextField = new TextField();
binder.forField(caloriesTextField)
.withValidator(CustomCaloryValidator::isValidValue, "Must be valid a positive amount")
.withConverter(new StringToCaloriesConverter("Must be an integer"))
.bind(Food::getCalories, Food::setCalories);

// This line fails with the error because the types do not match.
foodGrid.addColumn(Food::getCalories, new NumberRenderer(myNumberFormat))
.setEditorComponent(new TextField(), Food::setCalories);

不幸的是,这不起作用并出现以下错误:

类型参数“C”的推断类型“C”不在其范围内;应该实现 'com.vaadin.data.HasValue'

我到处寻找,但除了简单编辑之外找不到任何示例。 demo sampler确实有一个使用 slider 的更复杂的示例,但我无法弄清楚如何从该示例中推断......

我理解这个错误,它试图将 long 映射到字符串。但是我找不到向 addColumn 添加转换器以使其工作的方法...

最佳答案

首先主要问题是 Binder 没有指定泛型类型,它需要是:

Binder<Food> binder = foodGrid.getEditor().getBinder();

而不是:

Binder binder = foodGrid.getEditor().getBinder();

话虽如此,还有其他几个问题。首先,当您执行 forField() 时您需要跟踪该绑定(bind),以便稍后能够使用该列进行设置。这对我来说根本不清楚。具体来说,您需要:

Binder.Binding<Food, Long> caloriesBinder = binder.forField(caloriesTextField)
.withValidator(CustomCaloryValidator::isValidValue, "Must be valid a positive amount")
.withConverter(new StringToCaloriesConverter("Must be an integer"))
.bind(Food::getCalories, Food::setCalories);

我对卡路里绑定(bind)器不是 100% 确定,因为我的代码不同,这是一个示例,但您需要该绑定(bind)。然后,您采用该绑定(bind)并执行以下操作:

foodGrid.getColumn("calories").setEditorBinding(caloriesBinding);

这允许正确的编辑器工作。这是在文档中的,但示例非常简单,所以我错过了。

下一步非常重要,具体取决于您要显示的内容,是添加渲染器,否则您可能会遇到一些奇怪的问题。例如,如果您使用 long 来存储货币,那么您需要将其转换为显示货币金额。同样,如果您使用日期,那么您可能也想对其进行格式化。然后您需要添加渲染器。我能找到如何在没有编译错误(类型不匹配)的情况下执行此操作的唯一方法是:

((Grid.Column<Food, Long>)foodGrid.getColumn("calories")).setRenderer(new CaloriesRenderer());

为了完整起见,您需要启用编辑器:

foodGrid.getEditor().setEnabled(true);

最后,如果该表是更大 bean 的一部分,那么您需要调用 foodGrid.setItems() ,你不能仅仅依赖binder.readBean()因为它不能接受列表。例如,如果 bean 不是食物而是由多种成分组成的膳食,那么您就不能做 binder.readBean(meal)你也做不到binder.readBean(meal.getIngredients)即使你可以做binder.readBean(meal)对于表格的其余部分。我让它发挥作用的唯一方法是:

binder.readBean(meal);
foodGrid.setItems(meal.getIngredients);

关于java - 有没有办法在可编辑的 Vaadin 8 网格中设置验证并编辑长值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45686486/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com