Empêcher le déplacement d'une fenêtre avec JavaFX

Cette astuce permet de verouiller la fenêtre à un emplacement.

Cette astuce est utile pour les splash screens (fenêtres d'attente) ou des notifications ou des fenêtres modales ou tout autre élément censé être indéplaçable.

import javafx.application.Application;
import javafx.geometry.Rectangle2D;
import javafx.scene.Scene;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.stage.Screen;
import javafx.stage.Stage;
import javafx.stage.StageStyle;

public class App extends Application {

  private static double WINDOW_WIDTH = 350;
  private static double WINDOW_HEIGHT = 350;

  @Override
  public void start(Stage stage) {

    Scene scene = new Scene(new VBox(), WINDOW_WIDTH, WINDOW_HEIGHT);
    scene.setFill(Color.DIMGREY);
    stage.setScene(scene);

    /*
     * Cache la barre de la fenêtre. Empêche le déplacement avec la barre de titre
     */
    stage.initStyle(StageStyle.UNDECORATED);

    /*
     * Empêche le redimensionnement de la fenêtre quand la fenêtre est déplacée sur
     * les bords de l'écran
     */
    stage.setMinWidth(WINDOW_WIDTH);
    stage.setMinHeight(WINDOW_HEIGHT);
    stage.setMaxWidth(WINDOW_WIDTH);
    stage.setMaxHeight(WINDOW_HEIGHT);

    /* Empêche le redimensionnement de la fenêtre */
    stage.setResizable(false);

    /* Affiche la fenêtre */
    stage.show();

    /* Centre la fenêtre à l'écran */
    Rectangle2D primaryScreenBounds = Screen.getPrimary().getVisualBounds();
    double centerX = (primaryScreenBounds.getWidth() - stage.getWidth()) / 2;
    double centerY = (primaryScreenBounds.getHeight() - stage.getHeight()) / 2;
    stage.setX(centerX);
    stage.setY(centerY);

    /* Empêche le déplacement de la fenêtre avec la touche ALT ou ALT + Espace */

    /* Chaque fois que la position X de la fenêtre est changée */
    stage.xProperty().addListener((obs, oldY, newY) -> {
      System.out.println(stage.getX() + " " + stage.getY());
      /* On centre la fenêtre en X */
      stage.setX(centerX);
    });

    /* Chaque fois que la position Y de la fenêtre est changée */
    stage.yProperty().addListener((obs, oldY, newY) -> {
      System.out.println(stage.getX() + " " + stage.getY());
      /* On centre la fenêtre en Y */
      stage.setY(centerY);
    });

  }

  public static void main(String[] args) {
    launch();
  }

}

Commentaires