2017-02-17 1 views
1

J'ai un FXML générique avec beaucoup de composants mais disons que c'est un textArea pour plus de simplicité.Java réutilisation générique 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" /> 

Et sur ce textArea vous pouvez voir qu'il a un ID de "test".

Donc, ma question est de savoir si vous pouvez réutiliser ce FXML dans plus de un contrôleur?

Ma première pensée a été mené par un contrôleur générique comme on le voit ci-dessous:

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


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




} 

Et pointer le FXML au GenericController. Et puis étendre dans un contrôleur plus spécifique. Mais je viens d'obtenir une erreur LoadExceptionError au fx: controller = "sample.Controllers.GenericController".

Répondre

2

Ne spécifiez simplement pas le contrôleur dans le fichier FXML, c'est-à-dire supprimez entièrement l'attribut fx:controller. Réglez ensuite le contrôleur lorsque vous chargez le FXML:

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

Il y a des choses plus avancées que vous pouvez faire en utilisant une usine de contrôleur, (qui, par exemple, vous pouvez combiner avec un cadre d'injection de dépendance) si vous avez besoin, mais On dirait que ce serait suffisant pour ce dont vous avez besoin. –

+0

Juste essayé ceci et je reçois toujours 'javafx.fxml.LoadException: Aucun contrôleur spécifié.' – audittxl

+0

@audittxl Alors vous faites quelque chose de mal. Vous appelez la méthode 'load()' sans argument, à droite, pas la méthode static 'load (URL)'? –