2014-09-02 12 views
5

mam ten niestandardowy kod TreeView:Edytuj element w 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; 
      } 
     }); 

chciałbym, aby móc zmienić nazwy węzłów drzewa przy użyciu programu Content Menu. Czy możesz mi pomóc w realizacji tego?

+1

To naprawdę potrzebuje więcej informacji. Jeśli chcesz zmienić nazwy przy użyciu menu kontekstowego, prawdopodobnie masz ustalony zestaw nazw do wyboru. Jakie są te imiona? W jaki sposób zaimplementowana jest twoja klasa 'Tree'? Prawdopodobnie pomoże ci pokazać, co wypróbowałeś, czego oczekiwałeś i jak zachowywał się inaczej od twoich oczekiwań. –

+0

Oto przykład, w którym używam http://stackoverflow.com/questions/22149137/drag-nodes-of-treeview – user1285928

+0

Potrzebujesz menu kontekstowego z akcją "zmień nazwę", która pozwala zmienić nazwę węzła? Po prostu kliknięcie elementu i rozpoczęcie edycji nie jest tym, czego szukasz? – janih

Odpowiedz

8

Możesz po prostu rozpocząć edycję węzła drzewa w EventHandler MenuItem. Oto przykładowy kod, który zezwala na podstawową edycję poprzez dwukrotne kliknięcie (I nie próbował zmieniać/zapobiec), a także z menu kontekstowego:

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

Jest to po prostu komórki zwyczaj drzewo Oracle example 13-1 z.