JavaFX屏幕分辨率缩放

May*_*uso 12 java javafx screen-resolution fxml

我一直在寻找一种方法来做到这一点,但我只找到了这个没有答案的问题.

我正在使用1366x768笔记本电脑开发,我使用JavaFX来创建GUI(很抱歉,但是我无法发布代码,它基本上是一个包含几个GridPanes的AnchorPane,其中包含更多GridPanes,其中包含标签,TextField和a情侣图表).

当我在另一个分辨率(1920x1080或1600x900)上加载项目时出现问题.

我正在使用stage.setMaximized(true);,但这只是缩放背景,舞台本身,因此所有元素和容器(面板,标签,TextFields .....)保持与1366x768分辨率相同的大小,使GUI"不适合"分辨率不完全是1366x768.

我希望我能很好地解释我的问题,我的英语远非完美.

有没有人对如何使元素按阶段分辨率进行缩放有任何建议?

(我需要在每台显示器中最大化或全屏显示软件,因此制作固定分辨率(例如1366x768)似乎不是一个好的解决方案).

谢谢你们.

更新:

我刚刚创建了一个小例子.它是默认JavaFX AnchorPane中的2x1 GridPane,我在网格窗格中添加了两个示例按钮.

<AnchorPane minHeight="-Infinity" minWidth="-Infinity" prefHeight="300.0" prefWidth="400.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" >
<children>
    <GridPane prefHeight="300.0" prefWidth="400.0">
        <columnConstraints>
            <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
        </columnConstraints>
        <rowConstraints>
            <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
            <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
        </rowConstraints>
        <children>
            <Button fx:id="example1" mnemonicParsing="false" text="Example 2" GridPane.halignment="CENTER" GridPane.valignment="CENTER" />
            <Button fx:id="example2" mnemonicParsing="false" text="Example 2" GridPane.halignment="CENTER" GridPane.rowIndex="1" GridPane.valignment="CENTER" />
        </children>
    </GridPane>
</children>
Run Code Online (Sandbox Code Playgroud)

这个代码在400x300屏幕上看起来不错(太少了,我知道,这只是一个例子),当我将它缩放到1366x768(不是真正的全屏,只是stage.setMaximized(true);)时,GridPane不能缩放,只有舞台本身,所以我有一个全屏幕背景,屏幕左上角有一个400x300的窗格(带有小按钮).

TL; DR:按钮保留在屏幕左上角的示例代码,当我扩大分辨率时,其余部分只是一个空白区域.

更新2; 忘了Java代码.

Parent root = FXMLLoader.load(getClass().getResource("UI.fxml"));
Scene scene = new Scene(root, java.awt.Toolkit.getDefaultToolkit().getScreenSize().width,
            java.awt.Toolkit.getDefaultToolkit().getScreenSize().height);
stage = new Stage();
stage.setMaximized(false);
stage.setScene(scene);
stage.setTitle("Example Menu");
stage.show();
Run Code Online (Sandbox Code Playgroud)

Tom*_*iak 3

您需要为子项设置锚定窗格约束。在你的情况下网格面板

AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0"
Run Code Online (Sandbox Code Playgroud)

这将在你之后

 GridPane prefHeight="300.0" prefWidth="400.0" **HERE** 
Run Code Online (Sandbox Code Playgroud)

这将最大化容器内的子组件,因此每侧都有 0 0 0 0 像素。

  • 我很少使用 AnchorPane ,问题是你用它来做其他事情,它实际上不是设计的目的,只是使用 Borderpane ,我自己就沉迷于 borderpanes , hboxes , vboxes 。选择可缩放控件的容器。 (2认同)