我需要在单击按钮时添加一堆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余行。有更好的方法吗?最佳做法是什么?
答案 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;
}
}