gpt4 book ai didi

java - 使用javaFX根据操作系统计算窗口装饰的大小

转载 作者:行者123 更新时间:2023-12-02 02:11:01 25 4
gpt4 key购买 nike

有没有办法从 JavaFX 知道 MacOS 窗口栏(分别是 Windows 或任何操作系统)的厚度? enter image description here

我想将多个窗口一个接一个地放置。

最佳答案

正如评论之一所建议的,如果 stage 是显示在屏幕上并且经过布局传递的舞台,您可以执行以下操作

Parent root = stage.getScene().getRoot();
Bounds localRootBounds = root.getBoundsInLocal();
Point2D localRootTopLeft = new Point2D(localRootBounds.getMinX(), localRootBounds.getMinY());
Point2D screenRootTopLeft = root.localToScreen(localRootTopLeft);

它给出了屏幕坐标中场景根部的左上角。

然后

double stageTopBorderThickness = screenRootTopLeft.getY() - stage.getY();

给出窗口位置与其根节点位置之间的差异。

这是一个快速演示:

import javafx.application.Application;
import javafx.geometry.Bounds;
import javafx.geometry.Insets;
import javafx.geometry.Point2D;
import javafx.geometry.Pos;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Spinner;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.stage.Modality;
import javafx.stage.Stage;

public class StageDecorationThicknessTest extends Application {

@Override
public void start(Stage primaryStage) {
Spinner<Integer> spinner = new Spinner<>(1, 10, 1);
Button open = new Button("Open Windows");
open.setOnAction(e -> {
int numWindows = spinner.getValue() ;
Parent root = primaryStage.getScene().getRoot();
Bounds localRootBounds = root.getBoundsInLocal();
Point2D localRootTopLeft = new Point2D(localRootBounds.getMinX(), localRootBounds.getMinY());
Point2D screenRootTopLeft = root.localToScreen(localRootTopLeft);
double stageTopBorderThickness = screenRootTopLeft.getY() - primaryStage.getY() ;

Stage owner = primaryStage ;
for (int i = 0 ; i < numWindows ; i++) {
Stage stage = new Stage();
Button close = new Button("Close");
close.setOnAction(evt -> stage.hide());
Scene scene = new Scene(new StackPane(close), primaryStage.getScene().getWidth(), 80);
stage.initOwner(owner);
stage.initModality(Modality.WINDOW_MODAL);
stage.setScene(scene);
stage.setX(primaryStage.getX());
stage.setY(screenRootTopLeft.getY() + i * stageTopBorderThickness);
stage.show();
owner = stage ;
}
});

VBox root = new VBox(10, spinner, open);
root.setPadding(new Insets(5));
root.setAlignment(Pos.CENTER);
Scene scene = new Scene(root);
primaryStage.setScene(scene);
primaryStage.show();
}

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

enter image description here

关于java - 使用javaFX根据操作系统计算窗口装饰的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50031317/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com