Как создать собственный композитный элемент управления без FXML? - PullRequest
0 голосов
/ 30 апреля 2019

Я хотел бы создать класс, который представляет составной элемент управления. Это будет HBox, который содержит другие элементы управления, такие как TextFields и т. Д.

Я знаю, что это можно сделать с использованием FXML, как в этом учебном пособии , но я хочу сделать это без него.

Это мой подход к решению этой проблемы:

Класс композитного управления

public class VInputText extends HBox {

    private HBox hbox;
    private FontAwesomeIconView icon;
    private TextField textField;
    private Label label;

    public VInputText(double spacing) {

        hbox = new HBox(spacing);
        hbox.setAlignment(Pos.CENTER_LEFT);
        hbox.setPrefSize(Control.USE_COMPUTED_SIZE, Control.USE_COMPUTED_SIZE);

        icon = new FontAwesomeIconView();
        icon.setGlyphName("TIMES");
        icon.setSize("1.3em");

        textField = new TextField();

        label = new Label("<- my validated field");

        hbox.getChildren().addAll(icon, textField, label);
    }
}

FXML

<AnchorPane prefHeight="300.0" prefWidth="400.0" xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1" fx:controller="pl.edu.utp.wtie.controllers.AppController">
   <children>
      <VBox fx:id="vBox" prefHeight="300.0" prefWidth="400.0" spacing="5.0" />
   </children>
</AnchorPane>

Контроллер

public class AppController {

    @FXML
    private VBox vBox;

    @FXML
    void initialize() {
        System.out.println("AppController.java");

        VInputText input = new VInputText(5);

        vBox.getChildren().add(input);

    }
}

Проблема в том, что приложение компилируется, но композитный элемент управления не отображается на сцене. Если оставшийся код понадобится, я могу его вставить. Заранее спасибо.

1 Ответ

0 голосов
/ 30 апреля 2019

Я вставил решение, решенное кем-то, но ответ был удален.Вместо создания HBox следует использовать это ключевое слово:

public class VInputText extends HBox {

    private FontAwesomeIconView icon;
    private TextField textField;
    private Label label;

    public VInputText(double spacing) {

        this.setSpacing(spacing);
        this.setAlignment(Pos.CENTER_LEFT);
        this.setPrefSize(Control.USE_COMPUTED_SIZE, Control.USE_COMPUTED_SIZE);

        icon = new FontAwesomeIconView();
        icon.setGlyphName("TIMES");
        icon.setSize("1.3em");

        textField = new TextField();

        label = new Label("<- my validated field");

        this.getChildren().addAll(icon, textField, label);
    }
}
...