如何在窗口外单击鼠标关闭Vaadin子窗口?
我正在使用vaadin 7,在我的应用程序中,我有时会使用子窗口.在一个案例中,我有一个模态窗口,里面有几个组件.单击模态窗口内的某些组件时,它会打开另一个窗口.当用户点击它时,我希望此窗口自动关闭(例如,再次在模态窗口上).在
Vaadin Sampler中,这种行为似乎在显示源时实现(单击右上角的源按钮).如果不是从模态窗口打开,则行为应该相同,但是从UI或任何其他子窗口打开.
我尝试了几件事: >使用Popupview是不可能的,因为我需要从组件(按钮或图像)打开窗口 实现这一目标的正确方法是什么? 谢谢 解决方法
我有同样的问题,对任何答案都不满意:
> @Steven Spungin提出的聚焦/模糊方法确实有效,但前提是窗口内没有其他可聚焦元素.否则单击其中一个元素将关闭窗口,这是非常不需要的. 我想到了一个基于客户端连接器创建简单 这是客户端连接器: @Connect(ClickOutsideComponentExtension.class) public class ClickOutsideComponentConnector extends AbstractExtensionConnector implements NativePreviewHandler { private ComponentConnector extendedConnector; private ClickOutsideComponentRpc rpc; private HandlerRegistration handlerRegistration; @Override protected void extend(ServerConnector target) { extendedConnector = (ComponentConnector) target; rpc = getRpcProxy(ClickOutsideComponentRpc.class); handlerRegistration = Event.addNativePreviewHandler(this); } @Override public void onUnregister() { super.onUnregister(); handlerRegistration.removeHandler(); } @Override public void onPreviewNativeEvent(NativePreviewEvent event) { if (extendedConnector.isEnabled()) { Element eventTarget = Element.as(event.getNativeEvent().getEventTarget()); if (Event.ONCLICK == event.getTypeInt() && !isElementInsideExtendedElement(eventTarget)) { rpc.onClickOutside(); } } } public boolean isElementInsideExtendedElement(Element element) { Element outsideElement = extendedConnector.getWidget().getElement(); Element insideElement = element; while (insideElement != null) { if (outsideElement.equals(insideElement)) { return true; } insideElement = insideElement.getParentElement(); } return false; } } RPC用于客户端和服务器端之间的通信: public interface ClickOutsideComponentRpc extends ServerRpc { void onClickOutside(); } 和服务器端扩展: public class ClickOutsideComponentExtension extends AbstractExtension { private List<ClickOutsideListener> clickOutsideListeners = new ArrayList<>(); public interface ClickOutsideListener extends Serializable { void onClickOutside(); } @Override public void extend(AbstractClientConnector target) { super.extend(target); registerRpc(new ClickOutsideComponentRpc() { @Override public void onClickOutside() { for (ClickOutsideListener listener : clickOutsideListeners) { if (listener != null) { listener.onClickOutside(); } } } }); } public void addClickOutsideListener(ClickOutsideListener listener) { clickOutsideListeners.add(listener); } } 如前所述,此解决方案适用于任何组件之外的点击,因此您可以执行以下操作: Label label = new Label("Try to click outside!"); ClickOutsideComponentExtension ext = new ClickOutsideComponentExtension(); ext.extend(label); ext.addClickOutsideListener(new ClickOutsideListener() { @Override public void onClickOutside() { Notification.show("Click outside of label"); } }); addComponent(label); 或点击窗外点击窗口: Button btn = new Button("Open window"); btn.addClickListener(new ClickListener() { @Override public void buttonClick(ClickEvent event) { Window w = new Window(); w.setContent(new Button("Focusable button")); w.center(); ClickOutsideComponentExtension ext = new ClickOutsideComponentExtension(); ext.extend(w); ext.addClickOutsideListener(new ClickOutsideListener() { @Override public void onClickOutside() { w.close(); } }); UI.getCurrent().addWindow(w); } }); addComponent(btn); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |