我正在开发一套要在嵌入式工业系统上运行的产品,在该系统中,需要稍微更改一个代码库才能成为多个不同的应用程序(约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进行处理,这是最合适的解决方案吗?
我对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();