我想根据文本字段中的输入数字动态添加新行。我已经在可见范围之外的fxml(场景构建器)中准备了这一行(textField和comboBox)。
所以我参考了我想要添加的这些对象:
@FXML
private ComboBox fieldType;
@FXML
private TextField fieldName;
根据其他textField中的数字,我将行添加到gridPane:
for (int i = 0; i < newRows; i++) {
grid.addRow(grid.impl_getRowCount(), fieldName, fieldType);
}
我得到了这个例外:
Exception in thread "JavaFX Application Thread" java.lang.IllegalArgumentException: Children: duplicate children added: parent = Grid hgap=0.0, vgap=5.0, alignment=TOP_LEFT
我以为我会像这样克隆这些对象:
public class CloningMachine implements Cloneable {
private Node node;
public CloningMachine() {
}
public CloningMachine setNode(Node node) {
this.node = node;
return this;
}
public Node getNode() {
return node;
}
protected Object clone() throws CloneNotSupportedException {
return super.clone();
}
}
for (int i = 0; i < newRows; i++) {
grid.addRow(grid.impl_getRowCount(), ((CloningMachine)new CloningMachine().setNode(fieldName).clone()).getNode(), ((CloningMachine)new CloningMachine().setNode(fieldType).clone()).getNode());
}
但是我得到了同样的例外。
有可能以某种方式做到吗?感谢
答案 0 :(得分:0)
您的CloningMachine
无效。
Object.clone
返回对象的副本,其中所有数据包括任何引用包含相同的数据。这意味着
((CloningMachine)new CloningMachine().setNode(n).clone()).getNode()
只是获取n
的一种复杂方式,即
((CloningMachine)new CloningMachine().setNode(n).clone()).getNode() == n
始终会产生true
。
The javadoc of Object.clone
包含有关实施clone
的以下句子。
通常,这意味着复制包含被克隆对象的内部“深层结构”的任何可变对象,并使用对副本的引用替换对这些对象的引用。
因此,要正确实现克隆,您需要手动复制Node
s(即使用构造函数创建一个新的并分配所有相关属性)。没有简单的方法。