Подтвердить что ты не робот

JavaFX: Почему stage.setResizable(false) вызывает дополнительные поля?

Это небольшое тестовое приложение JavaFX

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.BorderPane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;

public class ApplicationWithNonResizableStage extends Application {

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

    @Override
    public void start(final Stage primaryStage) throws Exception {
        final Rectangle rectangle = new Rectangle(200, 100, Color.POWDERBLUE);
        final BorderPane pane = new BorderPane(rectangle);
        final Scene scene = new Scene(pane);
        primaryStage.setScene(scene);
        primaryStage.setResizable(false);
        primaryStage.show();
    }
}

создать окно с нежелательным заполнением:

stage with margin

Удаление вызова primaryStage.setResizable(false) также удаляет эффект:

stage without margin

Что происходит не так?

4b9b3361

Ответ 1

Как уже отмечалось, это различное поведение! /resizable пахнет как ошибка (кто-то может рассмотреть вопрос о проблеме;-)

Более короткий (чем размер вручную) способ заключается в явной подгонке сцены к сцене:

primaryStage.setScene(scene);
primaryStage.setResizable(false);
primaryStage.sizeToScene();

Просто заметил, что это работает для jdk8, но не для jdk7.

Для удобства, обновление ошибки: исходный отчет, поданный jewelsea, был закрыт как дубликат (в новых координатах) https://bugs.openjdk.java.net/browse/JDK-8089008 - все еще открыт, прокомментирован быть только выиграть.

Ответ 2

Хотя это не объяснение, оно решает проблему:

@Override
public void start(final Stage primaryStage) throws Exception {
    final Dimension d = new Dimension(210, 110);
    final Rectangle rectangle = new Rectangle(d.width, d.height, Color.POWDERBLUE);
    final BorderPane pane = new BorderPane(rectangle);
    pane.maxWidth(d.height);
    pane.maxWidth(d.width);
    final Scene scene = new Scene(pane, d.width, d.height);
    primaryStage.setScene(scene);
    primaryStage.setResizable(false);
    primaryStage.setWidth(d.width);
    primaryStage.setHeight(d.height);
    primaryStage.show();
}

Ключ устанавливает ширину и высоту Stage в нужное время.

Ответ 3

Попробуйте создать размер для размера, который вы хотите использовать frame- Dimension name = new Dimension(height,width), затем установите размер размера в прямоугольник BorderPane и Scene. Вы хотите, чтобы все было одинакового размера?