JavaFX和FXML。何时对组件的引用加载到控制器类中?

时间:2012-07-02 15:48:04

标签: java javafx fxml

我有一个非常简单的fxml文件,带有一个复选框:

...
<AnchorPane id="AnchorPane" xmlns:fx="http://javafx.com/fxml" fx:controller="jfx01.T01">
...
<CheckBox fx:id="checkBox1" text="CheckBox" />
...

非常简单的控制器类如下:

public class T01 extends Application {

    @FXML protected CheckBox checkBox1;

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

         //here, here is the problem!
         System.out.println("checkBox1==null? "+ (checkBox1==null?"yes":"no"));

    }
}

此基本应用程序的输出为:

checkBox1==null? yes

在&#34;开始&#34;方法显然创建了组件,但尚未分配给控制器类的@FXML字段。作为测试没有其他错误,我添加了一个按钮和一个事件。 在那里分配了checkBox1!

    @FXML protected void handleButton1Action(ActionEvent event) {
        System.out.println("button pressed");
        checkBox1.setSelected(!checkBox1.isSelected());
    }

问题

如果我不能使用start方法,因为init还没有完成,那么init完成后第一个可用的方法是什么,因此组件可用?

2 个答案:

答案 0 :(得分:2)

Controller应实现javafx.fxml.Initializable并覆盖initialize(URL arg0, ResourceBundle res)方法。 CheckBox checkBox1将被FXMLLoader初始化并以initialize方式为您提供。方便的方法是将Controller和Main(扩展Application)类分开,因此app开始/入口点和FXML文件控制器应该是2个不同的类。

答案 1 :(得分:1)

您可以使用以下方法访问Controller中的主舞台:

Node source = (Node) event.getSource();
Stage stage = (Stage) source.getScene().getWindow();