2012-07-01 11 views
3

Je travaille actuellement sur un TreeView et je veux implémenter un ContextMenu qui apparaît sur rightClick sur un TreeCell. J'ai étudié les exemples mais je ne suis pas sûr de la façon dont je peux configurer le ContextMenu pour qu'il apparaisse sur toutes les cellules, pas seulement celles qui sont remplies d'enfants.JavaFX 2.0 TreeView ContextMenu

Here my code (pretty much the sample code): 

Constructor 
. 
. 
. 

this.setCellFactory(new Callback<TreeView<String>,TreeCell<String>>() 
    { 
      @Override 
      public TreeCell<String> call(TreeView<String> p) 
      { 
       return new TextFieldTreeCellImpl(); 
      } 
     }); 
    } 

    private final class TextFieldTreeCellImpl extends TreeCell<String> 
    { 

     private TextField textField; 
     private ContextMenu addMenu = new ContextMenu(); 

     @SuppressWarnings({ "rawtypes", "unchecked" }) 
    public TextFieldTreeCellImpl() 
     { 
      MenuItem addMenuItem = new MenuItem("Add Note"); 
      addMenu.getItems().add(addMenuItem); 
      addMenuItem.setOnAction(new EventHandler() 
      { 
       public void handle(Event t) 
       { 
        ImageView noteIcon = new ImageView(new Image(getClass().getResourceAsStream("../icons/note.png"))); 
      noteIcon.setFitHeight(16); 
      noteIcon.setFitWidth(16); 

        TreeItem newNote = new TreeItem<String>("New Note"); 
        getTreeItem().getChildren().add(newNote); 
       } 
      }); 
     } 

     @Override 
     public void startEdit() 
     { 
      super.startEdit(); 

      if (textField == null) 
      { 
       createTextField(); 
      } 
      setText(null); 
      setGraphic(textField); 
      textField.selectAll(); 
     } 

     @Override 
     public void cancelEdit() 
     { 
      super.cancelEdit(); 

      setText((String) getItem()); 
      setGraphic(getTreeItem().getGraphic()); 
     } 

     @Override 
     public void updateItem(String item, boolean empty) 
     { 
      super.updateItem(item, empty); 

      if (empty) 
      { 
       setText(null); 
       setGraphic(null); 
      } 
      else 
      { 
       if (isEditing()) 
       { 
        if (textField != null) 
        { 
         textField.setText(getString()); 
        } 
        setText(null); 
        setGraphic(textField); 
       } 
       else 
       { 
        setText(getString()); 
        setGraphic(getTreeItem().getGraphic()); 
        if (!getTreeItem().isLeaf()&&getTreeItem().getParent()!= null) 
        { 
         setContextMenu(addMenu); 
        } 
       } 
      } 
     } 

     private void createTextField() 
     { 
      textField = new TextField(getString()); 
      textField.setOnKeyReleased(new EventHandler<KeyEvent>() 
      { 
       @Override 
       public void handle(KeyEvent t) 
       { 
        if (t.getCode() == KeyCode.ENTER) 
        { 
         commitEdit(textField.getText()); 
        } 
        else if (t.getCode() == KeyCode.ESCAPE) 
        { 
         cancelEdit(); 
        } 
       } 
      });  
     } 

     private String getString() 
     { 
      return getItem() == null ? "" : getItem().toString(); 
     } 
    } 
} 

Répondre

2

Affichage contextMenu aux cellules "rempli d'enfants" est contrôlé uniquement avec des lignes:

if (!getTreeItem().isLeaf() && getTreeItem().getParent() != null) { 
    setContextMenu(addMenu); 
} 

supprimer si le contrôle popup de contextMenu à tous les nœuds/cellules.

Questions connexes