带有复选框和上下文菜单的 JavaFx TreeView

JavaFx TreeView with CheckBox and 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());

然后我尝试用 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");

但是复选框没有出现。它仍然是一个普通的树视图。

我认为用 CheckBoxesContextMenu 获得 TreeView 的最快方法是在工厂回调中添加 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;
  }
});

我为 CheckBoxes 调用通常的 TreeCell 工厂。但是,在返回单元格之前,我添加了 ContextMenu.

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

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