JavaFX 8:舞台插图(窗户装饰厚度)?

Posted

技术标签:

【中文标题】JavaFX 8:舞台插图(窗户装饰厚度)?【英文标题】:JavaFX 8: Stage insets (window decoration thickness)? 【发布时间】:2014-12-29 22:42:05 【问题描述】:

如何确定 JavaFX 中的舞台/窗口插图?在 Swing 中,我可以简单地写:

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

在 JavaFX 中获取边框大小和窗口标题栏的等效项是什么?

【问题讨论】:

【参考方案1】:

您可以通过查看相对于窗口宽度和高度的场景边界来确定这些。

给定 Scene scene;scene.getX()scene.getY(),给出窗口内 Scene 的 x 和 y 坐标。这些分别相当于左侧和顶部的插图。

右下角稍微复杂一点,但是

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

给出正确的插图,类似

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

给出底部插图。

这些值当然只有在场景被放置在窗口中并且窗口在屏幕上可见时才有意义。

如果你真的想要一个Insets 对象,你可以执行以下操作(如果边框或标题栏在窗口显示后改变大小,它甚至会保持有效):

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);
    

【讨论】:

谢谢。非常好的解决方案。

以上是关于JavaFX 8:舞台插图(窗户装饰厚度)?的主要内容,如果未能解决你的问题,请参考以下文章

拖动功能无法正常工作! JavaFX VBox 拖动

自定义primaryStage标题:以图标为中心

07-05 装饰器

Day807.装饰器模式 -Java 性能调优实战

第8章 装饰器模块和包

第三章:3.9 关上窗户