如何根据屏幕分辨率javafx动态设置fxml中的首选宽度和高度

时间:2015-12-28 02:50:06

标签: javafx fxml

我是javafx的新手。是否可以根据屏幕分辨率在fxml文件中动态设置首选宽度和高度?我知道如何获得屏幕分辨率并将其设置为阶段:

Screen screen = Screen.getPrimary(); 
Rectangle2D bounds = screen.getVisualBounds();
stage.setWidth(bounds.getWidth());
stage.setHeight(bounds.getHeight());

我的问题是关于在fxml文件中动态设置prefWidth和prefHeight。另外我想知道我是否可以以编程方式更改fxml文件中的属性值,我正在使用场景构建器。

1 个答案:

答案 0 :(得分:7)

您可以(有点)在FXML中执行此操作,但不能使用Scene Builder(据我所知)。您可以使用fx:factory属性获取主屏幕,并在<fx:define> block中对其进行定义。然后使用expression binding将根窗格的prefWidthprefHeight绑定到屏幕的宽度和高度。

这看起来像

MaximizedPane.fxml:

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

<?import javafx.scene.layout.StackPane?>
<?import javafx.scene.control.Label?>
<?import javafx.stage.Screen?>

<StackPane xmlns:fx="http://javafx.com/fxml/1"
           prefWidth="${screen.visualBounds.width}" 
           prefHeight="${screen.visualBounds.height}" >
    <fx:define>
        <Screen fx:factory="getPrimary" fx:id="screen"/>
    </fx:define>
    <Label text="A maximized pane"/>    
</StackPane>

这是一个快速测试工具:

import java.io.IOException;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class MaximizedFXMLPane extends Application {

    @Override
    public void start(Stage primaryStage) throws IOException {
        Scene scene = new Scene(FXMLLoader.load(getClass().getResource("MaximizedPane.fxml")));
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

(使用Scene Builder无法做到这一点的原因是它不支持在FXML中插入<fx:define>块的任何机制,等等。)