2014-09-02 9 views
5

Ich habe diesen benutzerdefinierten TreeView Code:bearbeiten Artikel in 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; 
      } 
     }); 

Ich mag wäre in der Lage sein, die Knoten des Baumes Inhalt Menü mit umbenennen. Kannst du mir helfen dies zu implementieren?

+1

Das braucht wirklich mehr Informationen. Wenn Sie diese über ein Kontextmenü umbenennen wollen, haben Sie vermutlich einen festen Namenssatz zur Auswahl. Was sind diese Namen? Wie wird Ihre 'Tree' Klasse implementiert? Es würde wahrscheinlich helfen zu zeigen, was Sie versucht haben, was Sie erwartet haben und wie es sich anders als Ihre Erwartungen verhalten hat. –

+0

Hier ist das Beispiel, das ich verwende http://StackOverflow.com/Questions/22149137/drag-nodes-of-Treeview – user1285928

+0

Sie möchten ein Kontextmenü mit "Element umbenennen" Aktion, mit der Sie einen Knoten umbenennen können? Einfach auf den Artikel klicken und mit der Bearbeitung beginnen ist nicht das was du suchst? – janih

Antwort

8

Sie könnten einfach die Bearbeitung eines Baumknotens in MenuItems EventHandler starten. Hier ist ein Beispiel-Code, der der grundlegende Bearbeitung durch einen Doppelklick lassen (ich habe nicht versucht, zu ändern/verhindern, dass) und auch aus dem Kontextmenü:

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

Dies ist im Grunde Oracle example 13-1 mit benutzerdefinierten Baumzellen.

Verwandte Themen