Voici un exemple d'utilisation d'un contrôleur injecté par Guice.
/**
* Loads a FXML file and injects its controller from the given Guice {@code Provider}
*/
public abstract class GuiceFxmlLoader {
public GuiceFxmlLoader(Stage stage, Provider<?> provider) {
mStage = Objects.requireNonNull(stage);
mProvider = Objects.requireNonNull(provider);
}
/**
* @return the FXML file name
*/
public abstract String getFileName();
/**
* Load FXML, set its controller with given {@code Provider}, and add it to {@code Stage}.
*/
public void loadView() {
try {
FXMLLoader loader = new FXMLLoader(getClass().getClassLoader().getResource(getFileName()));
loader.setControllerFactory(p -> mProvider.get());
Node view = loader.load();
setViewInStage(view);
}
catch (IOException ex) {
LOGGER.error("Failed to load FXML: " + getFileName(), ex);
}
}
private void setViewInStage(Node view) {
BorderPane pane = (BorderPane)mStage.getScene().getRoot();
pane.setCenter(view);
}
private static final Logger LOGGER = Logger.getLogger(GuiceFxmlLoader.class);
private final Stage mStage;
private final Provider<?> mProvider;
}
Voici une implémentation concrète du chargeur :
public class ConcreteViewLoader extends GuiceFxmlLoader {
@Inject
public ConcreteViewLoader(Stage stage, Provider<MyController> provider) {
super(stage, provider);
}
@Override
public String getFileName() {
return "my_view.fxml";
}
}
Notez que cet exemple charge la vue au centre d'un BoarderPane qui est la racine de la scène dans la scène. Cela n'a rien à voir avec l'exemple (détail d'implémentation de mon cas d'utilisation spécifique) mais j'ai décidé de le laisser dans l'exemple car certains peuvent le trouver utile.
0 votes
Vérifiez si cela fonctionne aussi : stackoverflow.com/questions/14370183/
0 votes
@Alvaro : avez-vous obtenu votre solution ? pouvez-vous passer des paramètres ? d'un contrôleur à un autre fichier contrôleur ?
3 votes
Oui. jewelsea a donné une explication au niveau du livre. C'est pourquoi j'ai accepté sa réponse