Добавление полей по нажатию кнопки - PullRequest
0 голосов
/ 23 ноября 2018

Мне нужно добавить несколько надписей и текстовых полей при нажатии кнопки.В этом случае мне нужно добавить их как правильный код, а не в FXML?

У меня есть класс Automobile, и мне нужно добавить около 10 меток и текстовых полей, когда пользователь нажимает кнопку «Добавить автомобиль».Есть ли лучший способ, чем добавлять их вот так:

Label label = new Label("State registration number:");
TextField textField1 = new TextField();
Label label2 = new Label("Brand:");
TextField textField2 = new TextField();
Label label3 = new Label("Model:");
TextField textField3 = new TextField();
Label label4 = new Label("Year of production:");

И так далее ... И если мне нужно добавить к ним некоторые другие атрибуты, мне нужно написать еще 30 строк.Есть ли лучший способ сделать это?Какова лучшая практика?

Ответы [ 2 ]

0 голосов
/ 23 ноября 2018

Это не самое лучшее решение, но хорошая база для начала с

import java.util.Arrays;
import java.util.List;
import java.util.Optional;

import javafx.application.Application;
import javafx.beans.value.ChangeListener;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class MultipleLabelTextFiledApp extends Application {
    private final ObservableList<CustomControl> customControls = FXCollections.observableArrayList();
    private final List<String> labels = Arrays.asList("label1", "label2", "label3", "label4", "label5");

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage stage) throws Exception {

        labels.stream().forEach(label -> customControls.add(new CustomControl(label)));

        VBox vBox = new VBox();
        vBox.getChildren().setAll(customControls);

        stage.setScene(new Scene(vBox));
        stage.show();

        getCustomControl("label1").ifPresent(customControl -> {
            customControl.getTextField().textProperty().addListener((ChangeListener<String>) (observable, oldValue, newValue) -> {
                System.out.println("textField with label1 handler new text=" + newValue);
            });
        });
    }

    private Optional<CustomControl> getCustomControl(String labelText) {
        return customControls.stream()
        .filter(customControl -> labelText.equals(customControl.getLabel().getText()))
        .findFirst();
    }
}

class CustomControl extends HBox {

    private final Label label = new Label();
    private final TextField textField = new TextField();

    {
        getChildren().addAll(label, textField);
    }

    public CustomControl(String text) {
        label.setText(text);
    }

    public Label getLabel() {
        return label;
    }

    public TextField getTextField() {
        return textField;
    }
}
0 голосов
/ 23 ноября 2018

Первое, что вам нужно, это переменная типа int, значением которой является количество меток и текстовых полей, которые вы хотите создать, это будет:

int amount = 10;

Вы должны объявить три массива: один из которых содержит текстиз меток это будет:

String [] text_labels = new String [] {"State registration number:", "Brand:", "Model:", "..."};

Затем вы должны объявить второй массив, который может быть:

Label [] labels = new Label[amount];

И третий:

TextField [] textfields = new Text field[amount];

После того, как вы их объявили, вы должны инициализировать метки и текстовые поля.Для этого вы можете сделать:

for(int i = 0; i < amount; i ++) {
  Label label = new Label(text_labels[i]);
  TextField textField = new TextField();
  labels[i] = label;
  textfields[i] = textField;
}

Таким образом, метки [0] будут такими же, как первая метка, которую вы написали в своем коде, и такими же для текстовых полей.

...