1

我想根据文本字段中的输入数字动态添加新行。我在可见范围之外的 fxml(场景构建器)中准备了这一行(文本字段和组合框)。

所以我参考了我想添加的这些对象:

@FXML
private ComboBox fieldType;

@FXML
private TextField fieldName;

并基于来自其他文本字段的数字,我将行添加到 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());
}

但是我得到了同样的例外。

有可能以某种方式做到吗?谢谢

4

1 回答 1

0

CloningMachine没有按预期工作。

Object.clone返回对象的副本,其中所有数据(包括任何引用)都包含相同的数据。这意味着

((CloningMachine)new CloningMachine().setNode(n).clone()).getNode()

只是一种复杂的获取方式n,即

((CloningMachine)new CloningMachine().setNode(n).clone()).getNode() == n

总是产生true

的 javadocObject.clone包含以下关于实现的句子clone

通常,这意味着复制任何包含被克隆对象的内部“深层结构”的可变对象,并将对这些对象的引用替换为对副本的引用

因此,要正确实现克隆,您需要Node“手动”复制 s(即使用构造函数创建一个新的并分配所有相关属性)。没有简单的方法可以解决这个问题。

于 2016-02-02T16:19:44.383 回答