JavaFX全屏时如何调整组件大小

9

原始尺寸截图

输入图片描述

全屏截图

输入图片描述

当我调整窗口大小时,如何更好地排列组件。 我正在使用FXML来创建GUI。

FXML代码

    <AnchorPane id="AnchorPane" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="style.LoginController">
   <children>
      <Button fx:id="login" layoutX="250.0" layoutY="242.0" mnemonicParsing="false" onAction="#login" prefHeight="32.0" prefWidth="101.0" text="Login" />
      <ImageView fx:id="img2" fitHeight="32.0" fitWidth="32.0" layoutX="109.0" layoutY="184.0" pickOnBounds="true" preserveRatio="true">
         <image>
            <Image url="@../../../../../Downloads/Drawing%20(23).png" />
         </image>
      </ImageView>
      <Label fx:id="title" alignment="CENTER" focusTraversable="false" layoutX="166.0" layoutY="48.0" opacity="0.83" prefHeight="42.0" prefWidth="269.0" styleClass="title" text="Label" textAlignment="CENTER" textOverrun="CENTER_ELLIPSIS">
         <font>
            <Font name="Arial Narrow" size="36.0" />
         </font>
      </Label>
      <TextField fx:id="txtusername" layoutX="159.0" layoutY="126.0" prefHeight="32.0" prefWidth="283.0" promptText="Username" styleClass="fields" />
      <PasswordField fx:id="txtpassword" layoutX="159.0" layoutY="183.0" prefHeight="32.0" prefWidth="283.0" promptText="Password" styleClass="fields" />
      <ImageView fx:id="img1" fitHeight="32.0" fitWidth="32.0" layoutX="109.0" layoutY="126.0" pickOnBounds="true" preserveRatio="true">
         <image>
            <Image url="@../../../../../Downloads/Drawing%20(22).png" />
         </image>
      </ImageView>
      <ProgressIndicator fx:id="progress" layoutX="197.0" layoutY="120.0" minHeight="0.0" minWidth="0.0" prefHeight="128.0" prefWidth="188.0" progress="0.0" styleClass="progressind" />
   </children>
</AnchorPane>

你能在问题中添加FXML代码吗? - ItachiUchiha
请检查FXML代码 :) - Diluk Angelo
当您增加应用程序的大小时,您希望组件位于屏幕中央还是希望它们在大小上拉伸并增大? - ItachiUchiha
我希望它们能够稍微调整大小并保持居中。就像响应式应用程序一样。 - Diluk Angelo
2个回答

13

问题是因为您正在使用AnchorPane作为根面板。虽然您可以在此类情况下使用AnchorPane,但是我个人不喜欢它,因为需要做很多事情才能做到正确。有更简单的方法可以实现,这就是我要向您展示的。

从Javadocs中得知:

AnchorPane允许将子节点的边缘锚定到与锚点面板边缘的偏移量。

解决方案

使用不同的布局。可以使用GridPaneVBox。这些布局具有子对齐方式而不是锚点,允许将子节点对齐到特定位置。

如果要调整子元素的大小,您可以在它们上面设置HGrow/VGrow属性。

示例

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.geometry.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>


<VBox alignment="CENTER" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" spacing="20.0" style="-fx-background-color: DARKCYAN;" xmlns="http://javafx.com/javafx/8.0.40" xmlns:fx="http://javafx.com/fxml/1">
   <children>
      <Label text="Easy Doctor" />
      <TextField promptText="Username" />
      <TextField promptText="Password" />
   </children>
   <padding>
      <Insets bottom="50.0" left="50.0" right="50.0" top="50.0" />
   </padding>
</VBox>

这里是一个关于它外观的小gif:

enter image description here


这对我不起作用。控制器是否可以做些什么来阻止调整大小? - Francisc
这对于VBox子元素的宽度对我有效,但不适用于高度。我如何影响高度? - user3853134

1
请添加。
AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0"

对于图像、按钮、标签等组件,特定大小意味着当屏幕调整大小时,它将根据其自身进行调整,就像CSS中的边距一样。

或者

您可以添加CSS以根据屏幕大小对齐此组件

Scene scene = new Scene(root);
scene.getStylesheets().add(locator.locateAsURL("Css/StudentApp.css").toExternalForm());
scene.getStylesheets().add(("CSS/studentapp.css"));

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