Adding/creating 使用 SelectionMode.MULTI 的 Vaadin 网格行的点击事件?

Adding/creating a click event for rows to a Vaadin Grid with SelectionMode.MULTI?

我正在尝试创建一个小应用程序,其中我将各种文件位置存储在 Vaadin 网格中,该网格当前仅显示两列 - IDFile 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()));
});