2014-09-02 2 views
5

У меня есть этот пользовательский код TreeView:Редактировать элемент в JavaFX TreeView

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

Я хотел бы, чтобы иметь возможность переименовать узлы дерева с использованием содержимого меню. Можете ли вы помочь мне реализовать это?

+1

Это действительно требует дополнительной информации. Если вы хотите переименовать их в контекстном меню, вы, вероятно, имеете фиксированный набор имен для выбора. Что это за имена? Как реализуется класс 'Tree'? Вероятно, это поможет показать, что вы пробовали, что вы ожидали от этого, и как оно по-другому отличалось от ваших ожиданий. –

+0

Вот пример, который я использую http://stackoverflow.com/questions/22149137/drag-nodes-of-treeview – user1285928

+0

Вам нужно контекстное меню с действием «переименовать», которое позволяет вам переименовать узел? Просто щелкнуть элемент и начать редактирование - это не то, что вы ищете? – janih

ответ

8

Вы можете просто начать редактирование узла дерева в EventHandler MenuItem. Вот пример кода, который позволяет осуществлять базовое редактирование двойным щелчком (я не пытался изменить/предотвратить это), а также из контекстного меню:

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

Это в основном на заказ дерева клетки Oracle в example 13-1 с.

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