我想在每次点击按钮时将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");
这里无法做到。我该如何解决这个问题呢?
答案 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;
}
}
}