问题描述
当使用 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 尚未注入这些字段。