这是另一种更适用于具有可聚焦控件的模态窗口的方法。
在 Vaadin 中打开模态窗口后,UI 不会收到任何点击事件,但窗口会收到。但是,客户端不会向服务器发送玻璃点击。
您需要扩展 Window 以接收对玻璃的点击。单击玻璃后,您将关闭窗口。
注意:我们假设 Vaadin 如何创建 Window 元素以访问 Glass 元素。很可能有更好的方法。简而言之,我们等待窗口附加,然后等待 100 毫秒让玻璃附加,然后在玻璃上安装点击处理程序。
点击处理程序
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();
});