JavaFX TreeView добавление элемента в древовидную структуру приводит к одинаковому поведению двух ячеек
Я готов проанализировать определение схемы XML и получить TreeView из проанализированного файла, а затем добавить и удалить элементы из TreeView перед созданием XML .
Моя проблема в том, что когда я хочу добавить TreeItem из выбранного, дублируя его, это приводит к неправильному поведению двух TreeItem: выбранного и нового.
Например, расширение одного TreeItem также приводит к расширению другого.
SchemaTreeCell.java
public class SchemaTreeCell extends TreeCell<SchemaElement> {
GridPane grid = new GridPane();
private JFXButton bt ;
private ContextMenu detailsMenu ;
private TreeItem<SchemaElement> newItem;
private MenuItem showItem ;
private MenuItem addMenuItem;
private MenuItem deleteItem;
public SchemaTreeCell() {
showItem = new MenuItem("Show Details");
addMenuItem = new MenuItem("Add Element");
deleteItem = new MenuItem("Remove Element");
detailsMenu = new ContextMenu();
detailsMenu.getItems().add(showItem);
detailsMenu.getItems().add(addMenuItem);
detailsMenu.getItems().add(deleteItem);
bt = new JFXButton("Commit");
showAction();
addAction();
deleteAction();
}
protected void addAction() {
addMenuItem.setOnAction(new EventHandler<ActionEvent>() {
public void handle(ActionEvent t) {
String max = getItem().getMaxOccurs().equals("unbounded")? "100" : getItem().getMaxOccurs();
if (numberOccurence(getTreeItem())>=Integer.parseInt(max)) {
Alert alert = new Alert(AlertType.WARNING);
alert.setHeaderText("Be Careful");
alert.setContentText("Verify the Max Occurence of this item");
alert.show();
}
else {
newItem = new TreeItem<>();
newItem = getTreeView().getSelectionModel().getSelectedItem();
getTreeItem().getParent().getChildren().add(newItem);
addMenuItem.setOnAction(null);
t.consume();
}
}
});
}
@Override
protected void updateItem(SchemaElement item, boolean empty) {
super.updateItem(item, empty);
if (isEmpty()) {
setGraphic(null);
setText(null);
}else {
setText(item == null ? ""
: item.getValue() == null ? "<" + item.getName() + "/>"
: "<" + item.getName() + ">" + item.getValue() + "<" + item.
setContextMenu(detailsMenu);
}
}
Вот как я назвал CellFactory
getSchemaView().setCellFactory(new Callback<TreeView<SchemaElement>, TreeCell<SchemaElement>>() {
@Override
public TreeCell<SchemaElement> call(TreeView<SchemaElement> list) {
return new SchemaTreeCell();
}
});
1 ответ
Вы добавляете точно то же самое TreeItem
это уже выбрано для дерева. TreeItem
имеет expanded
состояние (и другое состояние, которое вы почти наверняка не хотите реплицировать), поэтому, если вы развернете этот элемент дерева, развернутся оба представления.
Вместо этого создайте новый элемент дерева с тем же значением и добавьте его в дерево:
addMenuItem.setOnAction(new EventHandler<ActionEvent>() {
public void handle(ActionEvent t) {
String max = getItem().getMaxOccurs().equals("unbounded")? "100" : getItem().getMaxOccurs();
if (numberOccurence(getTreeItem())>=Integer.parseInt(max)) {
Alert alert = new Alert(AlertType.WARNING);
alert.setHeaderText("Be Careful");
alert.setContentText("Verify the Max Occurence of this item");
alert.show();
}
else {
newItem = createDeepCopy(getTreeView().getSelectionModel().getSelectedItem());
getTreeItem().getParent().getChildren().add(newItem);
addMenuItem.setOnAction(null);
t.consume();
}
}
});
// ...
private TreeItem<SchemaElement> createDeepCopy(TreeItem<SchemaElement> original) {
TreeItem<SchemaElement> copy = new TreeItem<SchemaElement>(original.getValue());
for (TreeItem<SchemaElement> child : original.getChildren()) {
copy.getChildren().add(createDeepCopy(child));
}
return copy ;
}