带有CheckBox和ContextMenu的JavaFx TreeView

use*_*830 2 checkbox treeview javafx contextmenu

在教程http://docs.oracle.com/javafx/2/ui_controls/tree-view.htm中,它解释了如何使用ContextMenu或CheckBox创建TreeView.

但有可能同时拥有它们吗?

当我第一次复制粘贴代码时,我了解到我只能有一个setCellFactory,因为它们会相互覆盖.

    // the following two setCellFactory are copied from the tutorial

    // this create TreeCell with ContextMenu
    treeView.setCellFactory(new Callback<TreeView<String>,TreeCell<String>>(){
        @Override
        public TreeCell<String> call(TreeView<String> p) {
            return new TextFieldTreeCellImpl();
            //the class TextFieldTreeCellImp is a TreeCell with ContextMenu
        }
    });

    // this create TreeCell with CheckBox
    tree.setCellFactory(CheckBoxTreeCell.<String>forTreeView());
Run Code Online (Sandbox Code Playgroud)

然后我尝试用CheckBoxTreeCell替换TreeCell

    //class TextFieldTreeCellImpl extends TreeCell<String> {
    class TextFieldTreeCellImpl extends CheckBoxTreeCell<String> {
    ...
    //TreeItem newTag = new TreeItem<String>("New tag");
    CheckBoxTreeItem newTag = new CheckBoxTreeItem<String>("New tag");
Run Code Online (Sandbox Code Playgroud)

但是没有出现复选框.它仍然是一个正常的树视图.

gfk*_*kri 6

我想以最快的方式获得TreeViewCheckBoxesContextMenu被加入ContextMenu工厂回调中:

treeView.setCellFactory(new Callback<TreeView<String>,TreeCell<String>>() {

  @Override
  public TreeCell<String> call(TreeView<String> param) {
    TreeCell<String> cell = CheckBoxTreeCell.<String>forTreeView().call(param);
    ContextMenu menu = new ContextMenu();
    MenuItem item1 = new MenuItem("Item 1");
    MenuItem item2 = new MenuItem("Item 2");

    EventHandler<ActionEvent> eh = new EventHandler<ActionEvent>() {

      @Override
      public void handle(ActionEvent event) {
          System.out.println("Item '" + event.getSource() + 
            "' of cell '" + cell + "' was clicked.");
      }
    };

    item1.setOnAction(eh);
    item2.setOnAction(eh);
    menu.getItems().add(item1);
    menu.getItems().add(item2);
    cell.setContextMenu(menu);
    return cell;
  }
});
Run Code Online (Sandbox Code Playgroud)

我打电话给通常的TreeCell工厂CheckBoxes.但是,在返回单元格之前,我添加了ContextMenu.

使用EventHandler,您可以指定相应项目的单击行为.

如果您还有其他问题,或者这不是您满意的解决方案,请随时与我联系.