JavaFX:为什么stage.setResizable(false)会导致额外的边距?

时间:2013-12-22 17:33:51

标签: java javafx windows-7-x64 javafx-8

这个小型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

出了什么问题?

3 个答案:

答案 0 :(得分:41)

正如已经评论的那样,!/ resizable的这种不同行为闻起来像一个bug(有人可能会考虑提交问题;-)

较短(比手动调整大小)方式是明确地将舞台适合场景:

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

注意到这适用于jdk8,但不适用于jdk7。

为方便起见,更新了一个错误:jewelsea提交的原始报告已作为(新坐标)https://bugs.openjdk.java.net/browse/JDK-8089008的副本关闭 - 仍然打开,评论为仅赢。

答案 1 :(得分: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的宽度和高度。

答案 2 :(得分:0)

尝试为您想要框架的尺寸创建尺寸 - Dimension name = new Dimension(height,width) - 然后将尺寸尺寸设置为矩形BorderPane和Scene。您确实希望所有内容的大小都相同吗?