我正在尝试创建一个小型应用程序,其中我将各种文件位置存储在 Vaadin 网格中,该网格当前仅显示两列 - ID
和File Name
,并且每当我单击一行时,我也希望看到文件位置的通知。
意思是,每次我单击网格中的一行时,我希望它使用 Notification.show()
显示位置。 ,像这样:
(请忽略 <b></b>
,它们是不相关的。)
因为我的网格选择模型是 MULTI
,默认情况下,单击监听器无法注册它被单击的行,并且通过复选框选择该行不是我想要显示的数据。简而言之,我想获取我单击的每一行的项目,并将位置显示为通知。
到目前为止,我找到了类似问题的解决方案,但它处理 Vaadin 网格中的列和行与我习惯的有很大不同。
public static <T> void addColumnClickListener(Grid<T> grid, Consumer<Column<T>> listener)
{
String expression = "function(){const col=element.getEventContext(event).column;return col ? col.id : '';}()";
grid.getElement().addEventListener("click", e ->
{
String colId = e.getEventData().getString(expression);
Optional<Column<T>> column = grid.getColumns().stream().filter(col -> colId.equals(col.getId().get())).findFirst();
column.ifPresent(listener);
}
).addEventData(expression);
}
我要这样调用该函数:
addColumnClickListener(grid, column -> Notification.show("fubar"));
此代码片段来自the Vaadin forums我不太明白。字符串expression
似乎它包含可能的 JavaScript 代码,其余部分覆盖列的类型。 (我想,我真的不完全理解这个片段)
有什么方法可以做与上面的代码片段类似但针对行的事情吗?
最佳答案
您可以使用网格上的 ItemClickListener 来执行此操作:
grid.addItemClickListener(item -> {
Notification.show(String.format("File location: %s", item.getLocation()));
});
关于java - 使用 SelectionMode.MULTI 将行添加/创建点击事件到 Vaadin 网格?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60168288/