Вычисление размера оформления окна в зависимости от ОС с помощью javaFX

Есть ли способ узнать толщину оконных полос MacOS (соответственно Windows или любой ОС) из JavaFX? Вычисление размера оформления окна в зависимости от ОС с помощью javaFX

Я хочу разместить несколько окон одно под другим.

Вы пробовали использовать свойства width и height в Stage?

M. le Rutte 25.04.2018 23:05

да, он не учитывает эту полосу.

Myoch 25.04.2018 23:24

По крайней мере, для окон, которые уже отображаются, должна быть возможность преобразовать границы корня сцены в координаты экрана и сравнить с положением окна.

fabian 26.04.2018 00:26
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
3
99
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как предлагается в одном из комментариев, если 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);
    }
}

Другие вопросы по теме