【问题标题】:JavaFX screen resolution scalingJavaFX 屏幕分辨率缩放
【发布时间】:2016-07-27 23:13:14
【问题描述】:

我一直在寻找一种方法来做到这一点,但我只找到了This question without answers

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

当我以其他分辨率(1920x1080 或 1600x900)加载项目时,问题就出现了。

我正在使用stage.setMaximized(true);,但这只是缩放背景、舞台本身,因此所有元素和容器(面板、标签、文本字段......)的大小与 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>

这段代码在 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();

【问题讨论】:

  • 恐怕没有看到一些代码就无法提供帮助。听起来像是布局问题,可能是硬编码的位置或大小。您是否阅读了有关链接问题的 cmets?似乎是一个类似的问题。
  • 我什么也没硬编码。我用JavaFX SceneBuilder 2 做了所有事情,在查看大小时,所有内容(最小值、首选项和最大值)都显示为USE_COMPUTED_SIZE。我知道如果没有看到代码就很难提供帮助,但是如果我将代码放到网上,我可能会被解雇,我不希望这样,抱歉。感谢您尝试提供帮助:)
  • 我明白了,但也许您可以编写一个与您的工作无关的小型、独立的示例?只是一个带有一两个组件的简单屏幕来模拟问题?
  • 您的代码和 fxml 会很高兴看到 :)
  • 添加了我刚刚做的一个小例子的 Java 和 FXML 代码。

标签: java javafx fxml screen-resolution


【解决方案1】:

您需要在子节点上设置锚窗格约束。在你的情况下网格窗格

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 个像素。

【讨论】:

  • 你甚至无法想象我现在有多爱你 :) 这对于这个小例子来说非常有效。
  • 我猜我需要将此代码添加到实际项目中的每个面板中,以缩放所有元素,对吧?例如,如果我在 GridPane 中有一个按钮,我会将 GridPane.leftAnchor="0,0 "... 其余部分添加到 Button 元素中。可以吗?
  • 锚窗格就像锚一样,当你把孩子放在那里时,它的硬编码位置。如果你最大化窗口,例如在更高的分辨率上,那么你准备好了,在 yoru scenebuidler 中它看起来不错,它没有只知道那个硬编码的位置,所以如果你缩放它看起来很奇怪,它只会在父级内的那个像素处保持静态。
  • 我很少使用 AnchorPane ,问题是你用它来修饰它真的不是设计的,就使用 Borderpane ,我自己沉迷于边框窗格,hboxes,vboxes 。选择可缩放控件的容器。
  • 是的,如果您将使用锚窗格,您必须设置此属性以确保您的控件可缩放,在场景构建器中单击您想要缩放的锚窗格的子级,在布局选项中您有不错的 UI 锚窗格约束。如果需要,将所有边设置为 0 或其他值
猜你喜欢
  • 2016-10-21
  • 1970-01-01
  • 2019-11-17
  • 1970-01-01
  • 2015-06-29
  • 2015-04-24
  • 2023-04-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多