2017-02-17 127 views
1

我有一些通用FXML与许多组件,但让我们说它是一个textArea为简单起见。Java重用通用FXML

<?xml version="1.0" encoding="UTF-8"?> 

<?import javafx.scene.control.TextArea?> 


<TextArea fx:id="test" prefHeight="200.0" prefWidth="200.0" promptText="test data" xmlns="http://javafx.com/javafx/8.0.101" xmlns:fx="http://javafx.com/fxml/1" /> 

而在此textArea上,您可以看到它有一个“test”标识。

所以我的问题是你可以重复使用这个FXML在多于一个控制器?

我最初的想法是通过一个通用控制器,如下图所示:

public abstract class GenericController { 
    Program program = Program.getInstance(); 
    @FXML TextArea test; 


    @FXML 
    abstract void initialize(); 
    abstract void setData(); 




} 

,并指出了FXML到GenericController。 然后延伸它在一个更具体的控制器。但我只是得到一个LoadExceptionError错误在fx:controller =“sample.Controllers.GenericController”

回答

2

只要不在FXML文件中指定控制器,即完全删除fx:controller属性。然后设置控制器时,您加载FXML:

FXMLLoader loader = new FXMLLoader(getClass().getResource("path/to/generic.fxml")); 
GenericController controller = new SpecificControllerImplementation(); 
loader.setController(controller); 
Parent root = loader.load(); 
+0

有更先进的东西,你可以使用控制器的工厂做的,(其中,例如,你可以用一个依赖注入框架结合起来),如果你需要,但它听起来像这将足以满足你的需求。 –

+0

刚刚试过这个,我仍然得到'javafx.fxml.LoadException:没有指定控制器.' – audittxl

+0

@audittxl然后你做错了什么。你正在调用无参数的load()方法,不是静态的'load(URL)'方法吗? –