如何在视图加载后运行代码块

问题描述

当使用 fxml 文件和控制器时,可能有一个 initialize 方法,它在视图加载之前运行。同样,有没有办法在视图加载后运行一段代码
更具体地说,我在 fxml 文件中有一个 Rectangle。我想在视图加载并传递 Rectangle 实例后从控制器调用 setFill()LinearGradient 方法LinearGradient 有没有 setter 的属性,也没有无参数的构造函数,所以我认为不能在 fxml 文件中分配 fill 属性
我尝试将此代码放入控制器的构造函数中,但这会导致错误。如果可能的话,我还想知道当 FXMLLoader 加载 fxml 文件(何时调用构造函数)时,控制器类会发生什么过程。

如有必要,请查看此示例代码

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

<?import javafx.scene.layout.Pane?>
<?import javafx.scene.shape.Rectangle?>

<Pane fx:controller="sample.RectController" xmlns:fx="http://javafx.com/fxml">
    <Rectangle fx:id="rect" height="200.0" width="200.0" />
</Pane>
package sample;
import javafx.fxml.FXML;
import javafx.scene.paint.Color;
import javafx.scene.paint.CycleMethod;
import javafx.scene.paint.LinearGradient;
import javafx.scene.paint.Stop;
import javafx.scene.shape.Rectangle;

public class RectController{
    @FXML Rectangle rect;
    {
        //code i would like to run but currently results in an error
        rect.setFill(new LinearGradient(
            0,0.5,1,true,CycleMethod.NO_CYCLE,new Stop(0,Color.BLUE),new Stop(1,Color.RED)
        ));
    }
}

解决方法

您希望您的控制器实现一个用 initialize() 注释的无参数 @FXML 方法(旧方法是实现 javafx.fxml.Initializable 但正如您从 docs for that method ,您不再需要该界面。)

您不能在控制器的构造函数中执行此操作,因为 FXMLLoader 尚未注入这些字段。