4

是否可以fx:controller=""在一个 FXML 文件中添加两个控制器 ()?

我只能设法添加一个fx:controller=""

查看代码

<BorderPane id="BorderPane" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="596.0" prefWidth="600.0" xmlns:fx="http://javafx.com/fxml" fx:controller="demoapp.ClientArea">
4

2 回答 2

2

您不能在一个 FXML 文件中使用 设置多个控制器 (fx:controller=""),而是考虑手动注入控制器,基本上有两种方法:

使用setController方法而不提及 FXML 文件中的控制器:

FXMLLoader loader = new FXMLLoader();
URL location = getClass().getClassLoader().getResource("fxml/ClientArea.fxml");
loader.setLocation(location);   
loader.setController(new ClientArea());
// loader.setController(new Undecorator());
loader.load();

更合适的是,使用setControllerFactory方法:

首先,确保两个控制器都ClientArea 实现了文件中提到Undecorator的接口(包含事件处理程序方法) ,然后在从文件中加载视图时选择控制器:IcontrollerFXML(fx:controller="IController")FXML

FXMLLoader loader= new FXMLLoader();
URL location = getClass().getClassLoader().getResource("fxml/ClientArea.fxml");
loader.setLocation(location);
loader.setControllerFactory(new Callback<Class<?>, Object>() {   
    public Object call(Class<?> p) {
        return new ClientArea(); 
           // return new Undecorator();
    }
});
loader.load();
于 2013-04-01T13:05:35.893 回答
0

如果适合您的代码,您Undecorator.java可以从ClientArea.java. 因此,可以从其父级使用任何方法(或 FXML 方法/控件)ClientArea.java:. 使用 JavaFX SceneBuilder,不会在控制器选择中显示 package.ClientArea,但在运行时它会起作用。

于 2013-03-22T17:56:07.797 回答