【问题标题】:JavaFX: Why does stage.setResizable(false) cause additional margins?JavaFX:为什么 stage.setResizable(false) 会导致额外的边距?
【发布时间】:2014-01-10 23:55:18
【问题描述】:

这个小型 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();
    }
}

生成一个带有不需要的填充的窗口:

去掉primaryStage.setResizable(false)的调用也会去掉效果:

出了什么问题?

【问题讨论】:

  • 您找到解决方案了吗?它也会影响其他组件:stackoverflow.com/questions/22620919/…
  • @TVK:我只能为舞台解决问题。
  • 对我来说似乎是一个错误,您可以考虑在 fx 问题跟踪器中提交问题

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


【解决方案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】:

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

    【讨论】:

    • 感谢您的回复。手动设置尺寸并没有解决问题,因为在引入setResizable(false) 时,舞台也变得比应有的更大。
    • 尝试切换 'setResizable(false)' 和 'setScene(Scene)' 的顺序应该没关系,但有时会。
    猜你喜欢
    • 2015-02-21
    • 2017-03-17
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 2020-05-27
    • 1970-01-01
    • 2016-02-06
    相关资源
    最近更新 更多