单击按钮添加字段

时间:2018-11-23 12:48:10

标签: java javafx label

我需要在单击按钮时添加一堆Labels和TextFields。 在这种情况下,我需要将它们作为代码添加,而不是在FXML中添加?

我有汽车课,当用户单击“添加汽车”按钮时,我必须添加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 :(得分:0)

首先,您需要一个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;
}

因此,labels [0]与您在代码中编写的第一个标签相同,并且与文本字段相同。

答案 1 :(得分:0)

这不是最大的解决方案,而是一个很好的基础

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;
    }
}