En effet, setPositionY()
réinitialisera les paramètres de la fenêtre centered
à la propriété false
. Comme la largeur de votre pop-up et celle de la fenêtre de votre navigateur ne sont pas connues avant leur apparition à l'écran, le seul moyen que je connaisse pour obtenir ces valeurs est d'utiliser le module complémentaire SizeReporter. Son utilisation est assez simple :
public class MyUI extends UI {
private Window popUp;
private SizeReporter popUpSizeReporter;
private SizeReporter windowSizeReporter;
@Override
protected void init(VaadinRequest request) {
Button button = new Button("Content button");
VerticalLayout layout = new VerticalLayout(button);
layout.setMargin(true);
popUp = new Window("Pop-up", layout);
popUp.setPositionY(40);
addWindow(popUp);
popUpSizeReporter = new SizeReporter(popUp);
popUpSizeReporter.addResizeListenerOnce(this::centerPopUp);
windowSizeReporter = new SizeReporter(this);
windowSizeReporter.addResizeListenerOnce(this::centerPopUp);
}
private void centerPopUp(ComponentResizeEvent event) {
int popUpWidth = popUpSizeReporter.getWidth();
int windowWidth = windowSizeReporter.getWidth();
if (popUpWidth == -1 || windowWidth == -1) {
return;
}
popUp.setPositionX((windowWidth - popUpWidth) / 2);
}
}
Ce morceau de code sera correct tant que vous ne redimensionnerez pas la fenêtre pop-up. Si vous le faites, elle ne sera pas automatiquement recentrée. Si vous remplacez addResizeListenerOnce()
par addResizeListener()
alors il recentrera automatiquement la fenêtre pop-up mais vous aurez quelques "problèmes d'interface" car le module complémentaire envoie des événements de redimensionnement presque continuellement pendant que vous redimensionnez votre fenêtre pop-up...
Vous pourriez essayer de le faire à l'aide de CSS, mais personnellement j'évite autant que possible les CSS avec Vaadin :).
Vous devrez recompiler le widgetset après avoir ajouté l'add-on comme dépendance.
Je ne me porte pas garant de la portabilité de cette solution, mais je pense qu'elle fonctionnera sur la plupart des navigateurs modernes.
public class MyUI extends UI {
private Window popUp;
@Override
protected void init(VaadinRequest request) {
Button button = new Button("Content button");
VerticalLayout layout = new VerticalLayout(button);
layout.setMargin(true);
popUp = new Window("Pop-up", layout);
popUp.setPositionY(40);
popUp.addStyleName("window-center");
addWindow(popUp);
// Add a JS function that can be called from the client.
JavaScript.getCurrent().addFunction("centerWindow", args -> {
popUp.setPositionX((int) ((args.getNumber(1) - args.getNumber(0)) / 2));
});
// Execute the function now. In real code you might want to execute the function just after the window is displayed, probably in your enter() method.
JavaScript.getCurrent().execute("centerWindow(document.getElementsByClassName('window-center')[0].offsetWidth, window.innerWidth)");
}
}