Vaadin:MouseDown / MouseUp和KeyDown / KeyUp均衡

时间:2017-07-12 11:37:50

标签: vaadin

是否可以使用Vaadin处理MouseDown / MouseUp和KeyDown / KeyUp evens?我发现forum thread有同样的问题,看起来答案是否定的,但这是5年前的事情 - 我希望以后的版本会有所改变。我仍然无法在API中找到任何内容。也许有一些解决方法可以拦截这样的事件?

1 个答案:

答案 0 :(得分:1)

好吧,几天后我想出了可接受的(对我来说)解决方案。必需的组件必须用扩展拦截器(在评论中为@petey提供信用)包含KeyDownHandler。但诀窍不是添加到组件本身(因为它可能会错过触发),,但 RootPanel。所以这是一个有效的例子。

扩展:

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;
    }

}

ServerRpc:

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-button状态。