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