嵌入式JavaFX,注入视图和Dagger 2

问题描述 投票:0回答:1

我正在开发一套要在嵌入式工业系统上运行的产品,在该系统中,需要稍微更改一个代码库才能成为多个不同的应用程序(约20种产品)。它将使用Java 13和JavaFX,我打算使用Dagger 2注入不同的FXML视图和控制器,以创建不同的产品。例如,一种产品可能具有包含邮政编码文本字段的输入表单,而变体可能具有组合框而不是文本字段:

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.Button?>
<?import javafx.scene.control.CheckBox?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.BorderPane?>
<?import javafx.scene.layout.ColumnConstraints?>
<?import javafx.scene.layout.GridPane?>
<?import javafx.scene.layout.RowConstraints?>


<BorderPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1">
   <center>
      <GridPane BorderPane.alignment="CENTER">
        <columnConstraints>
          <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
          <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
        </columnConstraints>
        <rowConstraints>
          <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
          <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
          <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
        </rowConstraints>
         <children>
            <TextField promptText="First Name" />
            <TextField promptText="Last Name" GridPane.columnIndex="1" />
            <TextField promptText="Zip Code" GridPane.rowIndex="1" />
            <CheckBox mnemonicParsing="false" text="Include inflation factor" GridPane.columnIndex="1" GridPane.rowIndex="1" />
            <Button mnemonicParsing="false" text="Do Something" GridPane.rowIndex="2" />
            <Button mnemonicParsing="false" text="Cancel" GridPane.columnIndex="1" GridPane.rowIndex="2" />
         </children>
      </GridPane>
   </center>
</BorderPane>

对于这两个变体,控制器将非常相似,并且仅邮政编码文本字段与组合框的处理方式不同。

在其他变体中,“执行某些操作”按钮的事件处理程序将根据产品变体执行不同的操作。我希望能够在构建时定义这些变体,以便基于Gradle的构建服务器可以指定要构建的变体。

我如何使用Dagger 2进行处理,这是最合适的解决方案吗?

java javafx dependency-injection raspberry-pi dagger-2
1个回答
0
投票

我对Dagger 2不太了解,但是我知道如何使用常见的JavaFx Api:

“ Common.fxml”:

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.CheckBox?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.image.ImageView?>
<?import javafx.scene.layout.HBox?>

<fx:root spacing="10.0" type="HBox" xmlns="http://javafx.com/javafx/8.0.172-ea" xmlns:fx="http://javafx.com/fxml/1">
   <children>
      <Button text="xxx" onAction="#handleXxx"/>
   </children>
</fx:root>

变体的实现:

public class Variant1 {

    @FXML
    private void handleXxx() {
        // print 111
    }
}

public class Variant2 {

    @FXML
    private void handleXxx() {
        // print 222
    }
}

// in main
FXMLLoader loader1 = new FXMLLoader(getClass().getResource("Common.fxml"));
Variant1 variant1 = new Variant1();
loader1.setController(variant1);
Parent p1 = loader1.load();

FXMLLoader loader2 = new FXMLLoader(getClass().getResource("Common.fxml"));
Variant2 variant2 = new Variant2();
loader2.setController(variant2);
Parent p2 = loader2.load();
© www.soinside.com 2019 - 2024. All rights reserved.