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

Checkbox 带有复选框和上下文菜单的JavaFx TreeView,checkbox,javafx,treeview,contextmenu,Checkbox,Javafx,Treeview,Contextmenu,在本教程中,将解释如何使用ContextMenu或CheckBox创建树视图 但有可能两者兼得吗 当我第一次复制粘贴代码时,我知道我只能有一个setCellFactory,因为它们相互覆盖 // the following two setCellFactory are copied from the tutorial // this create TreeCell with ContextMenu treeView.setCellFactory(new Callback

在本教程中,将解释如何使用ContextMenu或CheckBox创建树视图

但有可能两者兼得吗

当我第一次复制粘贴代码时,我知道我只能有一个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());
//以下两个setCellFactory是从教程中复制的
//这将使用ContextMenu创建TreeCell
setCellFactory(新回调(){
@凌驾
公共TreeCell呼叫(TreeView p){
返回新的TextFieldTreeCellImpl();
//类TextFieldTreeCellImp是一个带有ContextMenu的TreeCell
}
});
//此复选框用于创建TreeCell
setCellFactory(CheckBoxTreeCell.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");
//类TextFieldTreeCellImpl扩展了TreeCell{
类TextFieldTreeCellImpl扩展CheckBoxTreeCell{
...
//TreeItem newTag=新的TreeItem(“新标签”);
CheckBoxTreeItem newTag=新的CheckBoxTreeItem(“新标签”);

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

我认为使用
复选框和
上下文菜单在工厂回调中添加
上下文菜单是获得
树视图的最快方法:

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;
  }
});
treeView.setCellFactory(新回调(){
@凌驾
公共TreeCell调用(TreeView参数){
TreeCell cell=CheckBoxTreeCell.forTreeView().call(param);
ContextMenu=新建ContextMenu();
MenuItem1=新MenuItem(“项目1”);
MenuItem2=新MenuItem(“项目2”);
EventHandler eh=新的EventHandler(){
@凌驾
公共无效句柄(ActionEvent事件){
System.out.println(“项“”+事件.getSource()+
“'of cell'”+cell+“'已单击。”);
}
};
第1项设定动作(eh);
第2项设定动作(eh);
menu.getItems().add(item1);
menu.getItems().add(item2);
cell.setContextMenu(菜单);
返回单元;
}
});
我为
复选框调用通常的
TreeCell
工厂。但是,在返回单元格之前,我添加了
上下文菜单

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


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

它有效!!!TreeCell同时具有复选框和上下文菜单。但我记得该事件。getSource()将返回一个MenuItem,而不是TreeCell。这是另一个主题思想。是的,它将返回。但是,当然,您可以在
事件处理程序中引用
单元格
。我相应地更新了示例。