使用fx:root是否需要以编程方式设置控制器?

时间:2012-11-29 00:46:17

标签: javafx-2 fxml

到处都看到有关使用FXMLLoader #setController()的解释,它与使用fx:root相关联,并且还以编程方式设置根节点(Oracle DocsSO answers都有此模式)。 这是一个要求吗?或者我可以创建一个常规的FXML(可能使用SceneBuilder)和一些好的旧容器,并稍后以编程方式设置 控制器吗?

在FXML中:

<BorderPane fx:id="root" prefHeight="500.0" prefWidth="600.0" xmlns:fx="http://javafx.com/fxml" > </Borderpane>

在某些代码中(可能是控制器):

FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("fxml_example2.fxml"));
fxmlLoader.setController(this);
try {
    fxmlLoader.load();            
} catch (IOException exception) {
    throw new RuntimeException(exception);
}

2 个答案:

答案 0 :(得分:5)

我不认为这是一项要求。我通过在我的Application类中调整Oracle tutorial code看起来像这样来实现这个目的:

@Override
public void start(Stage stage) throws Exception {

    FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("fxml_example.fxml"));
    fxmlLoader.setController(new ExampleController());
    Parent root = (Parent)fxmlLoader.load();

    stage.setTitle("FXML Welcome");
    stage.setScene(new Scene(root, 300, 275));
    stage.show();
}

正如您所看到的,我已经以编程方式设置了我的ExampleController,而不是使用FXML中的fx:controller="ExampleController",我没有必要在任何地方设置id:root

顺便说一句,我非常喜欢这种方法,因为它更模仿MVF中使用WPF设置数据上下文,并进一步将视图与控制器分离。

答案 1 :(得分:-1)

您也可以在SceneBuiler中同样进行设置:点击此处查看图片:1