Встроенный JavaFX, внедрение представлений и Dagger 2 - PullRequest
0 голосов
/ 12 марта 2020

Я разрабатываю набор продуктов, которые будут работать во встроенной промышленной системе, где одна база кода должна быть слегка изменена, чтобы стать несколькими различными приложениями (~ 20 продуктов). Он будет использовать Java 13 и JavaFX, и я намерен использовать Dagger 2 для внедрения различных представлений и контроллеров F XML в зависимости от создания различных продуктов. Например, один продукт может иметь форму ввода, содержащую текстовое поле с почтовым индексом, а вариант может вместо ComboBox иметь текстовое поле:

<?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>

Для обоих вариантов контроллер будет очень похож и только обработка почтового индекса TextField против ComboBox будет отличаться.

В других вариантах обработчик событий кнопки «Сделать что-то» будет выполнять различные действия в зависимости от варианта продукта. Я хотел бы иметь возможность определять эти варианты во время сборки, чтобы сервер сборки на основе Gradle мог указать, какой вариант собирать.

Как я могу go об этом использовать Dagger 2, и является ли это наиболее подходящим решением?

1 Ответ

0 голосов
/ 12 марта 2020

Я не знаю много о Dagger 2, но я знаю, как это сделать с обычным JavaFx Api:

"Common.f xml":

<?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();
...