2016-02-02 3 views
1

Я хочу динамически добавлять новые строки на основе номера ввода из текстового поля. Я подготовил эту строку (textField и comboBox) в fxml (построитель сцен) вне видимой области видимости.Добавление дублирующих объектов в GridPane как новую строку

Поэтому у меня есть ссылка на эти объекты, которые я хочу добавить:

@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()); 
} 

Однако я получаю такое же исключение.

Возможно ли это сделать? Thanks

+0

Вы не можете добавить узел дважды в граф сцены. Вам нужно создать новые экземпляры ComboBox и TextField и добавить их в новую строку. При необходимости вы можете скопировать значения из уже существующих узлов. – ItachiUchiha

+0

В конце концов, я создал новые экземпляры, как вы сказали. – Wlad

ответ

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 «вручную» (т.е. создать новый, используя конструктор и назначая все соответствующие свойства). Это нелегко.

Смежные вопросы