Edit item in JavaFX TreeView

I have this custom TreeView code:

treeView.setCellFactory(new Callback<TreeView<Tree>, TreeCell<Tree>>() { @Override public TreeCell<Tree> call(TreeView<Tree> treeView) { final TreeCell<Tree> cell = new TreeCell<Tree>() { @Override protected void updateItem(Tree item, boolean empty) { super.updateItem(item, empty); if (!empty) { setText(item != null ? item.toString() : ""); setGraphic(createImageView(item)); setContextMenu(createContextMenuTreeItem(item)); } else { setText(null); setGraphic(null); setContextMenu(null); } } }; return cell; } }); 

I would like to be able to rename tree nodes using the Content Menu. Can you help me realize this?

+5
source share
1 answer

You can simply start editing the node tree in the MenuItem EventHandler. Here is an example of code that allows you to perform basic editing with a double click (I'm not trying to change / prevent this), as well as from the context menu:

 import javafx.application.Application; import javafx.event.*; import javafx.scene.Scene; import javafx.scene.control.*; import javafx.scene.control.cell.TextFieldTreeCell; import javafx.scene.layout.StackPane; import javafx.stage.Stage; import javafx.util.*; import javafx.util.converter.DefaultStringConverter; public class TreeViewSample extends Application { public static void main(String[] args) { launch(args); } @Override public void start(Stage primaryStage) { primaryStage.setTitle("Tree View Sample"); TreeItem<String> rootItem = new TreeItem<String> ("Tree"); rootItem.setExpanded(true); for (int i = 1; i < 6; i++) { TreeItem<String> item = new TreeItem<String> ("Item" + i); rootItem.getChildren().add(item); } TreeView<String> tree = new TreeView<String> (rootItem); tree.setEditable(true); tree.setCellFactory(new Callback<TreeView<String>,TreeCell<String>>(){ @Override public TreeCell<String> call(TreeView<String> p) { return new RenameMenuTreeCell(); } }); StackPane root = new StackPane(); root.getChildren().add(tree); primaryStage.setScene(new Scene(root, 300, 250)); primaryStage.show(); } private static class RenameMenuTreeCell extends TextFieldTreeCell<String> { private ContextMenu menu = new ContextMenu(); public RenameMenuTreeCell() { super(new DefaultStringConverter()); MenuItem renameItem = new MenuItem("Rename"); menu.getItems().add(renameItem); renameItem.setOnAction(new EventHandler<ActionEvent>() { @Override public void handle(ActionEvent arg0) { startEdit(); } }); } @Override public void updateItem(String item, boolean empty) { super.updateItem(item, empty); if (!isEditing()) { setContextMenu(menu); } } } } 

This is basically Oracle example 13-1 with custom tree cells.

+8
source

Source: https://habr.com/ru/post/1201642/


All Articles