3

我到处都看到有关使用 o FXMLLoader#setController() 的解释,它与使用 fx:root 以及以编程方式设置根节点相关联(Oracle DocsSO 答案都有这种模式)。是要求吗?或者我可以使用一些好的旧容器创建一个常规的 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);
}
4

1 回答 1

6

我不认为这是一个要求。我通过在我的应用程序类中调整Oracle 教程代码使其看起来像这样来完成这项工作:

@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,而不是fx:controller="ExampleController"在 FXML 中使用,而且我不必在id:root任何地方进行设置。

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

于 2013-01-15T16:07:19.910 回答