我试图在我的vaadin网格中模拟正常的浏览器行为,其中包括鼠标中键点击以在新标签页中打开:
addItemClickListener(e -> {
boolean newTab = e.getMouseEventDetails().getButton() == MouseEventDetails.MouseButton.MIDDLE || e.getMouseEventDetails().isCtrlKey();
//open in window or new tab
});
但是,vaadin未注册鼠标中键。我怎么能让这个工作?
答案 0 :(得分:3)
该功能已包含在vaadin-grid(进入Vaadin 10)中,并且无法在Vaadin 8中使用。
对于Vaadin 8,您可以通过一些客户端扩展来拦截事件,或者使用ComponentRenderer
为每个组件添加Panel
(这可行但不理想{{3} }}):
grid.addColumn(item->{
Panel p = new Panel(item.getName());
p.setStyleName(ValoTheme.PANEL_BORDERLESS);
p.addClickListener(ev->{
System.out.println(ev.getButtonName());
});
return p;
}).setRenderer(new ComponentRenderer());
另一方面,客户端扩展允许侦听javascript事件(例如MouseEvent
)并触发服务器事件作为响应。创建扩展是一个非常复杂的主题(因为它使用了通常对开发人员隐藏的API的一部分),但它允许直接访问渲染的DOM,否则这是不可能的。
文档中的以下资源可能为您提供一个起点: because it degrades performance(仅描述了使用Java代码的简单扩展)和Creating a component extension(解释了如何将本机JavaScript代码添加到扩展中)。
答案 1 :(得分:1)
我如何在特定情况下解决问题:
服务器端:
public class MyGrid<T> extends Grid<T> {
public MyGrid(String caption, DataProvider<T, ?> dataProvider) {
super(caption, dataProvider);
MiddleClickExtension.extend(this);
}
public static class MiddleClickExtension<T> extends AbstractGridExtension<T> {
private MiddleClickExtension(MyGrid<T> grid) {
super.extend(grid);
registerRpc((rowKey, columnInternalId, details) -> grid.fireEvent(
new ItemClick<>(grid, grid.getColumnByInternalId(columnInternalId), grid.getDataCommunicator().getKeyMapper().get(rowKey), details)),
MiddleClickGridExtensionConnector.Rpc.class);
}
public static void extend(MyGrid<?> grid) {
new MiddleClickExtension<>(grid);
}
@Override
public void generateData(Object item, JsonObject jsonObject) {
}
@Override
public void destroyData(Object item) {
}
@Override
public void destroyAllData() {
}
@Override
public void refreshData(Object item) {
}
}
}
客户端:
@Connect(MyGrid.MiddleClickExtension.class)
public class MiddleClickGridExtensionConnector extends AbstractExtensionConnector {
@Override
protected void extend(ServerConnector target) {
getParent().getWidget().addDomHandler(event -> {
if (event.getNativeButton() == NativeEvent.BUTTON_MIDDLE) {
event.preventDefault();
CellReference<JsonObject> cell = getParent().getWidget().getEventCell();
getRpcProxy(Rpc.class).middleClick(cell.getRow().getString(DataCommunicatorConstants.KEY), getParent().getColumnId(cell.getColumn()),
MouseEventDetailsBuilder.buildMouseEventDetails(event.getNativeEvent(), event.getRelativeElement()));
}
}, MouseDownEvent.getType());
}
@Override
public GridConnector getParent() {
return (GridConnector) super.getParent();
}
public interface Rpc extends ServerRpc {
void middleClick(String rowKey, String columnInternalId, MouseEventDetails details);
}
}