2012. március 12., hétfő

Ablak a képernyő közepére

A Swing általában nem foglalkozik azzal, hogy az ablakot hol helyezi el a képernyőn: a bal felső sarokban jeleníti meg az új ablakokat. A JavaFX 2 már valamelyest kiközepeli, de szerintem nem pontos (bár lehet, hogy csak azért, mert a kliens területet nézi a képernyőn, a tálcát levágva).

Pofon egyszerű megoldani az ablak középre igazítását. Le kell tudni kérdezni a képernyő méreteit, az ablak szélességét, és tudni kell állítani a pozíciót.

Swing-ben szükség van a java.awt csomag Dimension és Toolkit osztályára, illetőleg a Window-ra. Mivel ez utóbbiból származik a JFrame és a JDialog is, ha Window-ra oldjuk meg a problémát, az mindkettőhöz használható lesz.
public static void centerizeWindow(Window w) {
    Dimension s = Toolkit.getDefaultToolkit().getScreenSize();
    Dimension d = w.getSize();
    int left = (int) ((s.width - d.width) / 2);
    int top = (int) ((s.height - d.height) / 2);
    w.setLocation(left, top);
}

JavaFX-ben az ablakot a Stage reprezentálja. JavaFX-ben is elérhetjük a képernyő tulajdonságait, ehhez a javafx.stage.Screen, illetve a javafx.geometry.Rectangle2D importokra van szükségünk.
public static void centerizeStage(Stage stage) {
    Rectangle2D screen = Screen.getPrimary().getVisualBounds();
    stage.setX((int) ((screen.getMaxX() - stage.getWidth()) / 2));
    stage.setY((int) ((screen.getMaxY() - stage.getHeight()) / 2));
}

Valójában a Stage a javafx.stage.Window leszármazottja, és a fenti metódusban is a Window gettereit/settereit használjuk, de a Window-nak nincs más olyan származtatása, amit középre igazítanánk a képernyőn, így az egyszerűbb használat érdekében maradhat a Stage típusú paraméter.