【问题标题】:JavaFX and FXML. When are the references to components loaded into the controller class?JavaFX 和 FXML。何时将组件的引用加载到控制器类中?
【发布时间】:2012-07-02 15:48:04
【问题描述】:

我有一个非常简单的 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

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

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

问题

如果由于 init 尚未完成而无法使用 start 方法,那么在 init 完成且组件可用的情况下,第一个可用的方法是什么?

【问题讨论】:

    标签: java javafx fxml


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      您可以通过以下方式在 Controller 中访问主舞台:

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

      【讨论】:

        猜你喜欢
        • 2013-07-22
        • 1970-01-01
        • 1970-01-01
        • 2013-03-04
        • 2014-06-11
        • 2018-08-03
        • 2016-10-03
        • 1970-01-01
        • 2013-12-25
        相关资源
        最近更新 更多