JavaFX TreeView 将项目添加到树视图会导致两个单元格的行为相同
JavaFX TreeView adding item to the treeview results the same behavior of the two cells
我愿意解析 XML 架构定义并从解析的文件中获取 TreeView,然后在生成 XML 之前添加和删除 TreeView 中的项目。
我的问题是当我想从选定的树项中添加一个 TreeItem - 复制它 - 导致两个 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();
}
});
您正在将已选择的完全相同的 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 ;
}
我愿意解析 XML 架构定义并从解析的文件中获取 TreeView,然后在生成 XML 之前添加和删除 TreeView 中的项目。
我的问题是当我想从选定的树项中添加一个 TreeItem - 复制它 - 导致两个 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();
}
});
您正在将已选择的完全相同的 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 ;
}