2012-07-01 6 views
3

В настоящее время я работаю над TreeView и хочу реализовать ContextMenu, который появляется на RightClick на TreeCell. Я изучил примеры, но я не уверен, как настроить ContextMenu на всплывающие окна в каждой ячейке, а не только на те, которые заполнены детьми.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(); 
     } 
    } 
} 

ответ

2

Показан Контекстный с «заполнен с детьми» клетка только контролируется с линиями:

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

удалить, если контроль выпадающий Контекстный все узлов/клетки.

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