TreeViewがあります。ツリーの項目にコンテキストメニューを追加し、ノードを追加してメニューの選択に反応します。何らかの理由で、コンテキストメニューを初めてクリックしても、メニューが消えず、TreeViewUIが更新されません。もう一度クリックすると、コンテキストメニューが消え、2つのアイテムがツリーに追加されます。もう一度コンテキストメニューに移動してクリックすると、通常はそれ以降毎回1つの項目が追加されます。何かアドバイス?
TreeItem.getChildren()。add()を使用してサブTreeItemを追加します。TreeCellファクトリ(コンテキストメニューを作成する)を作成するコードは次のとおりです。
public NodeTreeView(NodeView rootNodeView) {
setRoot(rootNodeView);
setCellFactory(new Callback<TreeView<String>,TreeCell<String>>() {
@Override
public TreeCell<String> call(TreeView<String> p) {
return new TextFieldTreeCellImpl();
}
});
getSelectionModel().setSelectionMode(SelectionMode.SINGLE);
getSelectionModel().selectedItemProperty().addListener(this);
}
@Override
public void changed(
ObservableValue<? extends TreeItem<String>> ov,
TreeItem<String> deselectedTreeItem,
TreeItem<String> selectedTreeItem) {
NodeView nodeView = null;
nodeView = (NodeView) selectedTreeItem;
System.out.println("Display properties for " + nodeView.getController().getType());
}
private final class TextFieldTreeCellImpl extends TreeCell<String> {
@Override
public void updateItem(String item, boolean empty) {
super.updateItem(item, empty);
if (empty) {
setText(null);
setGraphic(null);
} else {
NodeMenuController nodeMenuController = null;
nodeMenuController = new NodeMenuController(getController());
setText(getString());
setGraphic(getTreeItem().getGraphic());
setContextMenu(nodeMenuController.getView());
}
最後に、メニュー項目の作成方法は次のとおりです。
public class NodeMenuController {
private NodeController nodeController;
public NodeMenuController(NodeController controller) {
this.nodeController = controller;
}
public ContextMenu getView() {
ContextMenu contextMenu = null;
contextMenu = new ContextMenu();
if (ChildMap.hasAllowedChildren(nodeController.getType())) {
contextMenu.getItems().add(getAddChildMenuItem());
}
return contextMenu;
}
private MenuItem getAddChildMenuItem() {
Menu menu = null;
List<String> allowedChildList = null;
menu = new Menu("+ Child");
allowedChildList = ChildMap.get(nodeController.getType());
for (final String allowedChildType : allowedChildList) {
MenuItem menuItem = null;
menuItem = new MenuItem(allowedChildType);
menuItem.setOnAction(new EventHandler() {
@Override
public void handle(Event t) {
NodeController newNodeController = null;
newNodeController = new NodeController(new NodeModel(allowedChildType));
nodeController.add(newNodeController);
}
});
menu.getItems().add(menuItem);
}
return menu;
}
}