让我的JavaFX应用程序适应不同屏幕尺寸的最佳方法

8mmmxcuj  于 2023-11-15  发布在  Java
关注(0)|答案(2)|浏览(416)

就像我现在的代码一样,如果屏幕不够大,无法支持我设置的固定大小,应用程序的内容将被窗口切断。我想知道解决这个问题的最简单方法。与其更改每个UI元素,我希望有一种方法可以简单地让UI调整到窗口的任何大小,所以窗口应该能够从一个角落拉来调整大小,UI移动with it.
以下是舞台类:

public class Login {
    
    public void show(Stage primaryStage) {
        
        try {
            FXMLLoader loader = new FXMLLoader(getClass().getResource("Login.fxml"));
            Parent root = loader.load();
            Scene scene = new Scene(root);
            scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm());
            primaryStage.setScene(scene);
            primaryStage.setResizable(false);
            primaryStage.show();
        } 
        catch (Exception e) {
            e.printStackTrace();
        }
    }
    
}

字符串
下面是.fxml文件:

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

<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.image.ImageView?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.text.Font?>
<?import javafx.scene.image.Image?>

<AnchorPane prefHeight="960.0" prefWidth="540.0" xmlns="http://javafx.com/javafx/20.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="application.login.LoginController">
   <children>
      <ImageView fitHeight="261.0" fitWidth="210.0" layoutX="171.0" layoutY="302.0" pickOnBounds="true" preserveRatio="true">
        <Image url="@ledger.png" />
      </ImageView>
      <Label layoutX="134.0" layoutY="132.0" text="EffortLoggerV2">
         <font>
            <Font size="42.0" />
         </font>
      </Label>
      <Label layoutX="43.0" layoutY="768.0" text="Username">
         <font>
            <Font size="24.0" />
         </font>
      </Label>
      <Label layoutX="43.0" layoutY="818.0" text="Password">
         <font>
            <Font size="24.0" />
         </font>
      </Label>
      <TextField layoutX="164.0" layoutY="770.0" prefHeight="25.0" prefWidth="224.0" />
      <TextField layoutX="164.0" layoutY="820.0" prefHeight="25.0" prefWidth="224.0" />
      <Button fx:id="loginButton" layoutX="416.0" layoutY="770.0" mnemonicParsing="false" prefHeight="73.0" prefWidth="86.0" text="Sign In">
         <font>
            <Font size="18.0" />
         </font>
      </Button>
      <Button fx:id="createAccountButton" layoutX="193.0" layoutY="889.0" mnemonicParsing="false" text="Create an Account">
         <font>
            <Font size="18.0" />
         </font>
      </Button>
   </children>
</AnchorPane>


有没有简单的方法来做到这一点,或者这需要改变每个UI元素?

neekobn8

neekobn81#

前言:

无法使用固定大小创建屏幕大小自适应布局。
把“固定的”和“自适应的”两个词结合在一起,你就能看出问题。

解决方案:

在每个元素上,包括 * 窗格:
1.在任何地方都使用计算大小作为最小大小。
1.在任何地方都使用计算大小作为首选大小。
1.使用maxValue作为所有位置的最大大小。
1.使用hGrow总是无处不在的地方,它并不只与上述工作。
1.将“标示”的多行设定为true。

6xfqseft

6xfqseft2#

我不知道你到底想达到什么目的,但利用这里的想法,我提出了一个起点,我希望能有所帮助。你可能需要做一些关于JavaFX布局/父节点的教程。ImageView可能有点棘手。我希望这能帮助你朝着正确的方向前进。对于登录视图,在我看来,这是少数几种可以设置min的情况之一,和最大大小设置为相同的值,或者使用无法调整大小的屏幕。

FXML

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

<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.image.ImageView?>
<?import javafx.scene.layout.ColumnConstraints?>
<?import javafx.scene.layout.GridPane?>
<?import javafx.scene.layout.RowConstraints?>
<?import javafx.scene.layout.VBox?>
<?import javafx.scene.text.Font?>

<VBox alignment="TOP_CENTER" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="940.0" minWidth="540.0" prefHeight="960.0" prefWidth="540.0" xmlns="http://javafx.com/javafx/20.0.1" xmlns:fx="http://javafx.com/fxml/1">
   <children>
      <Label alignment="CENTER" maxWidth="1.7976931348623157E308" text="EffortLoggerV2">
         <font>
            <Font size="42.0" />
         </font>
         <VBox.margin>
            <Insets top="140.0" />
         </VBox.margin>
      </Label>
      <ImageView fitHeight="261.0" fitWidth="210.0" pickOnBounds="true" preserveRatio="true">
         <VBox.margin>
            <Insets top="100.0" />
         </VBox.margin>
      </ImageView>
      <GridPane hgap="5.0" vgap="10.0">
        <columnConstraints>
          <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
            <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
            <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
            <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
            <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
            <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
            <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
          <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>
            <Label alignment="CENTER_RIGHT" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" text="Username" GridPane.columnSpan="2">
               <font>
                  <Font size="24.0" />
               </font>
            </Label>
            <Label alignment="CENTER_RIGHT" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" text="Password" GridPane.columnSpan="2" GridPane.rowIndex="1">
               <font>
                  <Font size="24.0" />
               </font>
            </Label>
            <TextField maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" prefHeight="25.0" prefWidth="224.0" GridPane.columnIndex="2" GridPane.columnSpan="4" />
            <TextField maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" prefHeight="25.0" prefWidth="224.0" GridPane.columnIndex="2" GridPane.columnSpan="4" GridPane.rowIndex="1" />
            <Button fx:id="loginButton" maxHeight="1.7976931348623157E308" maxWidth="1.7976931348623157E308" mnemonicParsing="false" text="Sign In" GridPane.columnIndex="6" GridPane.columnSpan="2" GridPane.rowSpan="2">
               <font>
                  <Font size="18.0" />
               </font>
            </Button>
         </children>
         <padding>
            <Insets left="20.0" right="20.0" />
         </padding>
         <VBox.margin>
            <Insets top="140.0" />
         </VBox.margin>
      </GridPane>
      <Button fx:id="createAccountButton" mnemonicParsing="false" text="Create an Account">
         <font>
            <Font size="18.0" />
         </font>
         <VBox.margin>
            <Insets top="100.0" />
         </VBox.margin>
      </Button>
   </children>
</VBox>

字符串

正常

x1c 0d1x的数据

最大化


相关问题