JavaFX屏幕分辨率缩放

13

我一直在寻找一种方法来解决这个问题,但我只发现了一个没有答案的相关问题

我正在1366x768的笔记本电脑上开发,我使用JavaFX创建GUI(很抱歉,我不能发布代码,它基本上是包含一些GridPanes的AnchorPane容器,GridPanes包含更多的GridPanes,还有Labels、TextFields和一些Charts)。

当我将项目加载到其他分辨率(如1920x1080或1600x900)时出现问题。

我使用了stage.setMaximized(true);,但这只会缩放背景、舞台本身,因此所有元素和容器(面板、标签、文本字段等)的大小与1366x768分辨率下相同,使GUI在不完全符合1366x768分辨率要求的分辨率下“不适合”。

我希望我已经足够清楚地说明了我的问题,我的英语离完美还很远。

是否有人对如何使元素随着舞台分辨率缩放有任何建议?(我需要该软件在每个监视器中都是最大化或全屏显示,因此制定固定分辨率(例如1366x768)似乎不是一个好的解决方案。)

谢谢大家。

更新:

我刚刚创建了一个简单的示例,它是默认JavaFX AnchorPane内部的一个2x1 GridPane,我添加了两个示例按钮到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>

这段代码在400x300的屏幕上看起来很好(我知道太小了,这只是一个例子),当我将其缩放到1366x768(不是真正的全屏,只是stage.setMaximized(true);),GridPane不会缩放,只有Stage本身会缩放,因此我有一个全屏背景,并在屏幕左上角有一个400x300的Pane(带有其微小的按钮)。

简而言之:在我提高分辨率时,示例代码中的按钮保留在屏幕的左上角,其余部分都是空白。

更新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();

恐怕没有看到一些代码是无法提供帮助的。听起来像是布局问题,可能是硬编码的位置或大小。您有阅读链接问题上的评论吗?似乎是一个类似的问题。 - Modus Tollens
我没有硬编码任何内容。我使用JavaFX SceneBuilder 2完成了所有操作,而且在查看大小时,所有内容(最小值、首选值和最大值)都显示为USE_COMPUTED_SIZE。我知道如果没有看到代码很难提供帮助,但是如果我将代码放在网上,我可能会被解雇,我不想这样,抱歉。感谢您的尝试帮助 :) - Mayuso
我明白了,但也许你可以编写一个小的、自包含的示例,与你的工作无关?只需要一个简单的屏幕和一两个组件来模拟问题即可。 - Modus Tollens
你的代码和FXML文件可以让我看看吗 :) - edasssus
1
我刚刚完成了一个小例子,添加了Java和FXML代码。 - Mayuso
查看这个答案,了解一种基于屏幕分辨率设置FXML文件中首选宽度和高度的方法。也许会有帮助。 - Modus Tollens
1个回答

3
你需要在子元素上设置锚定面板约束条件,对于你的情况是网格面板。
AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0"

这将放置在你的后面。
 GridPane prefHeight="300.0" prefWidth="400.0" **HERE** 

这将最大化容器内的子组件,因此从每个边缘向内0 0 0 0像素。


1
你甚至无法想象我现在有多么爱你 :) 这个小例子完美地运行了。 - Mayuso
我猜我需要将这段代码添加到实际项目中的每个面板中,以使所有元素都被缩放,对吗?例如,如果我在GridPane中有一个按钮,我会将GridPane.leftAnchor="0,0"等代码添加到按钮元素中。可以这样做吗? - Mayuso
1
锚点面板的工作方式类似于锚点,当您将子元素放入其中时,它们的位置是硬编码的。例如,如果您最大化窗口以适应比您准备的分辨率更高的分辨率,则在您的SceneBuilder中看起来很好的位置变得奇怪,因为它仅知道硬编码的位置,因此如果您对其进行缩放,它将保持静态状态,并位于父级的那个像素上。 - Tomas Bisciak
2
我很少使用AnchorPane,因为它并不是为此设计的,如果你想要做一些东西,只需使用Borderpane,我自己沉迷于Borderpanes、Hboxes和Vboxes。选择一个可以缩放控件的容器。 - Tomas Bisciak
是的,如果您要使用AnchorPanes,则必须设置此属性以确保您的控件可以缩放。在SceneBuilder中,单击您想要缩放的AnchorPane的子项,在布局选项中,您可以找到漂亮的UI Anchor Pane Constraints。将所有边缘设置为0或其他需要的值。 - Tomas Bisciak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接