在GridPane上添加文本字段

时间:2016-07-01 06:25:03

标签: javafx

我想在每次点击按钮时将TextField添加到GridPane。当用户按下btn2时,会向TextField添加两个新的GridPane。我的代码是:

btn2.setOnAction(new EventHandler<ActionEvent>() {
    public void handle(ActionEvent event) {
        grid1.add(new TextField(), 0, b);
        grid1.add(new TextField(), 1, b);
        b = b + 1;
    }
});

但我无法从TextField获取数据或调用setPromptText方法,因为TextField没有名称。就像TextField的名称是tf1一样。我可以用

tf1.setPromptText("From");

这里无法做到。我该如何解决这个问题呢?

1 个答案:

答案 0 :(得分:1)

TextField置于合适的数据结构

示例:List<TextField[]>

(假设您只添加字段并在其他任何地方更改b。)

存储字段

List<TextField[]> textFields = ...

btn2.setOnAction(new EventHandler<ActionEvent>() {
    public void handle(ActionEvent event) {
        TextField tf1 = new TextField(), tf2 = new TextField();
        grid1.add(tf1,0,b);
        grid1.add(tf2,1,b);
        textFields.add(new TextField[] {tf1, tf2});
        b=b+1;
    }
});

检索字段

int row = ...
TextField[] tfs = textFields.get(row);
TextField tf1 = tfs[0];
TextField tf2 = tfs[1];

使用GridPane

的行和列属性

GridPane提供了静态方法来从它的子节点检索列和行索引。您可以使用它们来查找正确的元素(如果您每个(列/行组合)只添加了一个子项):

int row = ...
TextField tf1 = null;
TextField tf2 = null;
for (Node node : grid1.getChildren()) {
    Integer nodeRow = GridPane.getRowIndex(node);
    if (row == (nodeRow == null ? 0 : nodeRow)) {
         Integer nodeColumn = GridPane.getColumnIndex(node);
         int i = nodeColumn == null ? 0 : nodeColumn;
         if (i == 0) {
             tf1 = (TextField) node;
         } else if (i == 1) {
             tf2 = (TextField) node;
         }
    }
}