簡體   English   中英

可以將Afterburner.fx注入非演示者類嗎?

[英]Afterburner.fx injection into non-presenter classes possible?

正如標題所示,是否可以使用afterburner.fx將對象注入非演示者/控制器類? 一直試圖讓它工作,但坦率地沒有進展。

如您所知,使用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為null。

可以在此處找到原因:當實例化演示者時,將注入使用Inject注釋的字段。

這僅適用於演示者,並且不會掃描其他類以查找@Inject

幸運的是,有一種方法可以將模型,服務甚至演示者類注入非演示者類。 如果我們再次檢查afterburner.fx Injector ,我們將找到一些可以幫助我們的靜態方法。 基本上:

  • 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();
}

如果你運行它:

注入模型

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM