Vaadin Grid鼠标中键

时间:2018-01-08 01:40:40

标签: vaadin vaadin8 vaadin-grid

我试图在我的vaadin网格中模拟正常的浏览器行为,其中包括鼠标中键点击以在新标签页中打开:

addItemClickListener(e -> {
            boolean newTab = e.getMouseEventDetails().getButton() == MouseEventDetails.MouseButton.MIDDLE || e.getMouseEventDetails().isCtrlKey();
            //open in window or new tab
        }); 

但是,vaadin未注册鼠标中键。我怎么能让这个工作?

2 个答案:

答案 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);
    }
}