Возможна ли инъекция Afterburner.fx в классы, которые не проводятся? - PullRequest
0 голосов
/ 28 июня 2018

Как гласит заголовок, возможно ли добавить объекты в классы, не являющиеся презентаторами / контроллерами, с помощью afterburner.fx? Я пытался заставить его работать, но, откровенно говоря, безуспешно.

1 Ответ

0 голосов
/ 28 июня 2018

Как вы знаете, использование инъекции в 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();
}

Если вы запустите его:

inject model

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...