JavaFX 8: Inserts de scène (épaisseur de décoration de fenêtre)?


Comment puis-je déterminer les encarts stage/window dans JavaFX? En Swing, je pourrais simplement écrire:

JFrame frame = new JFrame();
Insets insets = frame.getInsets();

Quel serait l'équivalent en JavaFX pour obtenir la taille de la bordure et la barre de titre de la fenêtre?

Author: tobain, 2014-11-03

1 answers

Vous pouvez les déterminer en regardant les limites de la scène par rapport à la largeur et à la hauteur de la fenêtre.

Donné un Scene scene;, scene.getX() et scene.getY() donner les coordonnées x et y de la Scene dans la fenêtre. Ceux-ci sont équivalents aux encarts gauche et supérieur, respectivement.

La droite et le bas sont légèrement plus délicats, mais

scene.getWindow().getWidth()-scene.getWidth()-scene.getX()

Donne les bons encarts, et de même

scene.getWindow().getHeight()-scene.getHeight()-scene.getY()

Donne les encarts du bas.

Ces valeurs n'auront bien sûr qu'un sens une fois que la scène est placée dans une fenêtre et la fenêtre est visible sur l'écran.

Si vous voulez vraiment un objet Insets, vous pouvez faire quelque chose comme ce qui suit (qui resterait même valide si la bordure ou la barre de titre changeait de taille après l'affichage de la fenêtre):

import javafx.application.Application;
import javafx.beans.binding.Bindings;
import javafx.beans.binding.ObjectBinding;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class WindowInsetsDemo extends Application {

    @Override
    public void start(Stage primaryStage) {

        Label topLabel = new Label();
        Label leftLabel = new Label();
        Label rightLabel = new Label();
        Label bottomLabel = new Label();


        VBox root = new VBox(10, topLabel, leftLabel, bottomLabel, rightLabel);
        root.setAlignment(Pos.CENTER);

        Scene scene = new Scene(root, 600, 400);


        ObjectBinding<Insets> insets = Bindings.createObjectBinding(() -> 
        new Insets(scene.getY(), 
                primaryStage.getWidth()-scene.getWidth() - scene.getX(), 
                primaryStage.getHeight()-scene.getHeight() - scene.getY(), 
                scene.getX()),
                scene.xProperty(),
                scene.yProperty(),
                scene.widthProperty(),
                scene.heightProperty(),
                primaryStage.widthProperty(),
                primaryStage.heightProperty()
            );

        topLabel.textProperty().bind(Bindings.createStringBinding(() -> "Top: "+insets.get().getTop(), insets));
        leftLabel.textProperty().bind(Bindings.createStringBinding(() -> "Left: "+insets.get().getLeft(), insets));
        rightLabel.textProperty().bind(Bindings.createStringBinding(() -> "Right: "+insets.get().getRight(), insets));
        bottomLabel.textProperty().bind(Bindings.createStringBinding(() -> "Bottom: "+insets.get().getBottom(), insets));

        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}
 5
Author: James_D, 2014-11-03 22:50:05