Как вы знаете, использование инъекции в Afterburner работает в классах презентаторов:
public class AfterburnerPresenter {
@Inject
private Model model;
}
, но это не работает в классах, не являющихся ведущими:
public class JavaFXApplication100 extends Application {
@Inject
private Model model;
@Override
public void start(Stage stage) throws Exception {
model.set...;
}
}
это вернет исключение нулевого указателя, так как model
равно нулю.
Причина этого может быть найдена здесь : когда создается экземпляр докладчика, поля, помеченные Inject
, будут введены.
Это работает только для докладчиков, и никакие другие классы не сканируются в поисках @Inject
.
К счастью, есть способ внедрить классы моделей, услуг или даже презентаторов в классы, не являющиеся презентаторами. Если мы снова проверим afterburner.fx Injector
class , мы найдем несколько статических методов, которые помогут нам в этом. В основном:
Injector.instantiatePresenter(Class<T> clazz)
,
Injector.instantiateModelOrService(Class<T> clazz)
.
Sample
Давайте создадим быстрый образец.
Модель
public class Model {
private final StringProperty text = new SimpleStringProperty();
public final String getText() { return text.get(); }
public final void setText(String value) { text.set(value); }
public final StringProperty textProperty() { return text; }
}
AfterburnerPresenter
public class AfterburnerPresenter {
@FXML
private Label label;
@Inject
private Model model;
public void initialize() {
label.textProperty().bind(model.textProperty());
}
}
AfterburnerView
public class AfterburnerView extends FXMLView {
}
afterburner.fxml
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.AnchorPane?>
<AnchorPane id="AnchorPane" prefHeight="200" prefWidth="320" xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/8" fx:controller="<your.package>.AfterburnerPresenter">
<children>
<Button fx:id="button" layoutX="126.0" layoutY="89.0" text="Click Me!" />
<Label fx:id="label" layoutX="126" layoutY="120" minHeight="16" minWidth="69" />
</children>
</AnchorPane>
Класс применения
Давайте теперь добавим модель в основной класс:
@Override
public void start(Stage stage) throws Exception {
Parent root = new AfterburnerView().getView();
Model model = Injector.instantiateModelOrService(Model.class);
model.setText("This is a test");
Scene scene = new Scene(root);
stage.setScene(scene);
stage.show();
}
Если вы запустите его: