fx:控制器=“”在.FXML中

时间:2013-03-21 13:46:08

标签: javafx-2 javafx fxml

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

我可以设法只添加一个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">

2 个答案:

答案 0 :(得分:2)

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

使用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方法:

首先,确保控制器ClientAreaUndecorator都实现Icontroller文件{FXML中提到的接口((fx:controller="IController"),其中包含事件处理程序方法) 1}},然后在从FXML文件加载View时选择控制器:

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 Undeorator();
    }
});
loader.load();

答案 1 :(得分:0)

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