Vaadin:MouseDown/MouseUp和KeyDown/KeyUp evens

Vaadin:MouseDown/MouseUp和KeyDown/KeyUp evens,vaadin,Vaadin,是否可以使用Vaadin处理MouseDown/MouseUp和KeyDown/KeyUp evens?我发现了同样的问题,答案似乎是否定的,但那是5年前的事了——我希望以后的版本会有所改变。我仍然在API中找不到任何东西。也许有什么办法可以拦截这样的事件?好吧,几天后,我想出了一个(对我来说)可以接受的解决方案。所需组件必须用扩展拦截器包装(注释中的想法归功于@petey),内部带有KeyDownHandler。但是诀窍不是添加到组件本身(因为它可能会错过触发),而是添加到根面板。这里有一个有

是否可以使用Vaadin处理MouseDown/MouseUp和KeyDown/KeyUp evens?我发现了同样的问题,答案似乎是否定的,但那是5年前的事了——我希望以后的版本会有所改变。我仍然在API中找不到任何东西。也许有什么办法可以拦截这样的事件?

好吧,几天后,我想出了一个(对我来说)可以接受的解决方案。所需组件必须用扩展拦截器包装(注释中的想法归功于@petey),内部带有
KeyDownHandler
。但是诀窍不是添加到组件本身(因为它可能会错过触发),而是添加到根面板。这里有一个有效的例子

分机:

public class InterceptorExtension extends AbstractExtension {

    private boolean shiftKeyDown;

    public InterceptorExtension(Tree tree) {
        super.extend(tree);
        registerRpc((InterceptorExtensionServerRpc) state -> shiftKeyDown = state);
    }

    public boolean isShiftKeyDown() {
        return shiftKeyDown;
    }

}
服务器RPC:

public interface InterceptorExtensionServerRpc extends ServerRpc {

    void setShiftKeyDown(boolean state);

}
连接器:

@Connect(InterceptorExtension.class)
public class InterceptorExtensionConnector extends AbstractExtensionConnector {

    @Override
    protected void extend(final ServerConnector target) {
        final InterceptorExtensionServerRpc rpcProxy = getRpcProxy(InterceptorTreeExtensionServerRpc.class);
        final RootPanel rootPanel = RootPanel.get();
        rootPanel.addDomHandler(new KeyDownHandler() {
            @Override
            public void onKeyDown(KeyDownEvent event) {
                if (event.isShiftKeyDown()) {
                    rpcProxy.setShiftKeyDown(true);
                }
            }
        }, KeyDownEvent.getType());
        rootPanel.addDomHandler(new KeyUpHandler() {
            @Override
            public void onKeyUp(KeyUpEvent event) {
                if (!event.isShiftKeyDown()) {
                    rpcProxy.setShiftKeyDown(false);
                }
            }
        }, KeyUpEvent.getType());
    }

}

然后,只要您愿意,就可以通过InterceptorExtension#isShiftKeyDown在服务器端获取Shift按钮状态。

您使用的是什么Vaadin版本,以及您希望为哪些组件添加鼠标和键侦听器?这是可能的。@Morfic,8.1.0.beta1,树组件。根据开箱即用项单击和上下文单击侦听器的支持,使用
向上
向下
键导航,以及使用
键展开和折叠。如果你真的需要更多的东西(例如鼠标下移和鼠标上移,而不是点击),如果你能提供一个更详细的场景,那会很有帮助。@Morfic,好吧,至少我需要带Shift键的多选,这是开箱即用的。所以我要自己去检测换档压力。