这里有另一种更适用于具有可聚焦控件的模态窗口的方法。
在Vaadin中打开模态窗口后,UI不会接收任何点击事件,但Window会。然而,客户端不会将玻璃点击发送到服务器。
您需要扩展Window以接收玻璃上的点击。当单击玻璃时,然后关闭窗口。
注意:我们对Vaadin创建Window元素的方式进行了假设,以便访问Glass元素。可能有更好的方法。简而言之,我们等待窗口附加,然后等待100ms以使玻璃附加,然后在玻璃上安装一个点击处理程序。
点击处理程序
public interface ClickHandler extends ServerRpc {
void onClick(String elementId);
}
扩展器 - 服务器端
public class GlassClickExtender extends AbstractExtension {
public GlassClickExtender(Window window, ClickHandler clickHandler) {
extend((AbstractClientConnector) window);
registerRpc(clickHandler);
}
}
扩展器 - GlassClickExtenderClient
@Connect(GlassClickExtender.class)
public class GlassClickExtenderClient extends AbstractExtensionConnector {
private ClickHandler clickHandler;
@Override
protected void init() {
clickHandler = getRpcProxy(ClickHandler.class);
super.init();
}
@Override
protected void extend(ServerConnector serverConnector) {
try {
final Widget widget = ((ComponentConnector) serverConnector).getWidget();
widget.addAttachHandler(new AttachEvent.Handler() {
@Override
public void onAttachOrDetach(AttachEvent event) {
if (event.isAttached()) {
new Timer() {
@Override
public void run() {
Element windowElement = widget.getElement();
final Element glass = (Element) windowElement.getPreviousSibling();
if (glass == null || !glass.getClassName().contains("v-window-modalitycurtain")) {
return;
}
Event.sinkEvents(glass, Event.ONCLICK);
Event.setEventListener(glass, new EventListener() {
@Override
public void onBrowserEvent(Event event) {
if (Event.ONCLICK == event.getTypeInt()) {
clickHandler.onClick(glass.getId());
}
}
});
}
}.schedule(100);
}
;
}
;
});
} catch (Exception e) {
System.out.print(e.getMessage());
}
}
}
现在,扩展窗口并侦听点击
new GlassClickExtender(window, elementId -> {
close();
});