Afterburner.fx注入到非演示者类可能吗?

时间:2018-06-28 14:19:17

标签: java javafx dependency-injection

随着标题的发展,是否可以使用afterburner.fx将对象注入到非演示者/控制器类中?一直在努力使其正常运行,但坦率地说没有进展。

1 个答案:

答案 0 :(得分:2)

如您所知,在演示者类中使用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为空。

其原因可以在here中找到:演示者实例化时,将注入带有Inject注释的字段。

这仅适用于演示者,不会扫描其他类以寻找@Inject

幸运的是,有一种方法可以将模型,服务甚至演示者类注入非演示者类中。如果我们再次检查afterburner.fx Injector class,我们会发现一些静态方法可以帮助我们。基本上:

  • Injector.instantiatePresenter(Class<T> clazz)
  • Injector.instantiateModelOrService(Class<T> clazz)

样品

让我们创建一个快速示例。

模型

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