So schliessen Sie eine Vaadin-Fenster auf Mausklick außerhalb des Fensters?
Ich bin mit vaadin 7 und in meiner Anwendung verwende ich Kindfenster manchmal. In einem Fall habe ich ein modal-Fenster mit mehreren Komponenten in der it. Es öffnet sich ein weiteres Fenster, beim klicken auf einige der Komponenten innerhalb der modalen Fenster. Ich möchte dieses Fenster automatisch schließen, wenn der Benutzer klickt außerhalb (z.B. über das modale Fenster wieder). In der Vaadin-Sampler dieses Verhalten implementiert scheint bei der Anzeige der Quelle (klicken Sie auf die Taste source in der oberen rechten Ecke). Auch das Verhalten sollte gleich sein, wenn nicht geöffnet wird ein modales Fenster, aber von der Benutzeroberfläche aus oder jedem anderen Fenster.
Ich habe versucht, mehrere Dinge:
-
Mit Popupview ist nicht möglich, weil ich brauche, um das Fenster zu öffnen, die aus einer Komponente (button oder Bild)
-
Hinzufügen eines BlurListener dem neuen Fenster nicht funktionieren, weil wenn ich dann in das Fenster klicken, die blurevent ausgelöst wird (z.B. verschieben des Fensters)
-
Hinzufügen eines ClickListener zu den UI nicht helfen, weil das Ereignis wurde nicht ausgelöst, wenn ein Klick auf das modale Fenster.
Was ist der richtige Weg, das zu erreichen?
Dank
raffael
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich hatte das gleiche problem und war nicht zufrieden mit jeder Antwort:
UI.getCurrent().addClickListener
und zu prüfen, ob das click-Ereignis Koordinaten innerhalb eines Fensters, funktioniert, aber es hat ein großes problem: das click-Ereignis ist "verbraucht", die von Vaadin und ist nicht an den browser. Das bedeutet, dass Sie auf eine beliebige Stelle auf der Seite, die nicht im normalen Verhalten, wie z.B. native Kontextmenü wird nicht zeigen, bis auf der rechten Seite klicken.Ich kam mit einer Idee zu erstellen eine einfache
AbstractExtension
basiert auf einer client-side connector erweitert, dass eine bestimmte Komponente und hört auf alle click-events auf der einen Seite. Wenn das Ziel der click war nicht innerhalb der erweiterten Komponente benachrichtigt Sie server-side connector.Hier ist die client-side-connector:
RPC für die Kommunikation zwischen client-Seite und server-Seite:
- und server-side extension:
Wie gesagt, diese Lösung funktioniert für Klicks von außerhalb der jede Komponente, so können Sie etwas wie das hier tun:
oder ein Fenster schliessen, klicken Sie auf auf außerhalb von Ihr:
client
Paket, sonst wird es nicht kompiliert werden von der GWT-wie erwähnt-in offiziellen docs (unten auf der Seite). Auch stellen Sie sicher, dass widgetset kompilieren nach der client-seitige code-änderungen.Wenn das Fenster ist modal, das könnte helfen:
mit diesem css:
Wenn Fenster haben, fixieren Sie die position und die Größe, dann:
Hoffentlich Ihr problem lösen
Versuchen Sie Dies:
Ihrem Fenster benötigen Sie die Fokussierung vor dem auslösen des blur-Ereignis nach außen auf; werden Sie brauchen, um es zu öffnen, zuerst bevor Sie focus(), wie Vaadin ist rücksichtslos, in dieser Hinsicht.
Verhalten von Vaadin-Sampler, die du erwähnst, setzt auf windows, sind nicht-modal:
In diesem Fall können Sie hinzufügen, klicken Sie auf listener für das Fenster (oder UI/layout unter), wchich schließt Kind-Fenster, zB.
Wenn das Fenster modal ist, andere Komponenten sind nicht zugänglich, so gibt es wohl keine einfache Möglichkeit, zu definieren, klicken Sie auf alle Ereignisse, die außerhalb des aktuellen Fensters, dass geschossen werden konnte.
Hier ist ein anderer Ansatz, der funktioniert besser für modale Fenster mit fokussierbaren Steuerelemente.
Sobald Sie öffnen Sie ein modales Fenster, in Vaadin UI nicht bekommen hat, auf Veranstaltungen, aber das Fenster nicht. Allerdings, die der client nicht senden, Glas-Klicks an den server.
Benötigen Sie, um das Fenster zu erweitern, zu erhalten klickt auf das Glas. Wenn das Glas klicken, werden Sie dann das Fenster zu schließen.
Achtung: Wir machen Annahmen, wie Vaadin erstellt das Fenster-element zu bekommen, um das Glas-element. Es gibt wahrscheinlich bessere Möglichkeiten. Kurz gesagt, wir warten auf die Fenster zu befestigen, dann warten 100ms für das Glas zu befestigen, dann installieren Sie einen click-Ereignishandler auf dem Glas.
Den Click-Handler
Der Extender - server-Seite
Den Extender - GlassClickExtenderClient
}
Nun, erweitern Sie die Fenster und hören Sie das klicken Sie auf