【问题标题】:javafx CheckBoxTreeItem update parents programmaticallyjavafx CheckBoxTreeItem 以编程方式更新父母
【发布时间】:2017-06-13 15:40:16
【问题描述】:

我必须从我的数据库中检索一些数据来动态创建一个TreeView 并从这个TreeView 中选择一些CheckBoxTreeItems。这个TreeView 表示对菜单结构的权限。

我的疑问是当我创建TreeView 并以编程方式根据用户的权限从树中选择特定项目时,父项目没有任何状态更改(selectedindeterminate)。但是当我直接从界面中选择任何项目时,父母会得到更新。

例如,当我以编程方式选择项目时,这里有我的屏幕:

您可以看到我选择了两个菜单项,但父母没有。

在这张图片上,我使用屏幕选择了相同的菜单项,如果我在子菜单中选择所有子菜单,则父级更新为indeterminate 状态或selected

我浏览了 Stack Overflow 上的文档、谷歌和此处,但只找到了更新孩子的示例。

有没有办法以编程方式更新父母或在选择项目时调用从屏幕执行的事件?

编辑:

树中的所有项目都将independent 属性设置为false

【问题讨论】:

    标签: javafx treeview javafx-8


    【解决方案1】:

    我为这个问题提供了一个解决方法。 我必须先创建所有TreeView 结构,并在使用此代码sn-p 后更改selected 属性:

    Platform.runLater(new Runnable() {
        @Override
        public void run() {
           selectItems();
        }
    });
    

    这是验证TreeItems的代码:

    private void selectItems(){
        TreeItem root = tree.getRoot();
        if (root != null) {
            selectChildren(root);
        }
    }
    
    private void selectChildren(TreeItem<TesteVO> root){
        for(TreeItem<TesteVO> child: root.getChildren()){
            // HERE I CHECK IF THE USER HAS PERMISSION FOR THE MENU ITEM
            // IF SO, I CHANGE THE SELECTED PROPERTY TO TRUE
            if (child.getValue().id == 4) {
                ((CheckBoxTreeItem) child).setSelected(true);
            }
    
            // IF THERE ARE CHILD NODES, KEEP DIGGING RECURSIVELY
            if(!child.getChildren().isEmpty()) {
                selectChildren(child);
            }
        }
    }
    

    如果有更简单的方法,请告诉我!

    【讨论】:

      【解决方案2】:

      事实并非如此。当您选择子项时,父项会自动设置为不确定状态。我不确定这是否是在发布此问题时得到纠正的问题,可能不是。

      我的猜测是在如何选择节点或如何构造和初始化 TableView 方面存在编程错误。

      这里有一些代码显示了我正在做的事情,而且它有效!就我而言,我使用 CheckBoxTreeItem 作为 TreeItem。

      树视图是如何创建的

          treeView = new TreeView(root);
          treeView.getSelectionModel().selectedItemProperty().addListener(new ChangeListener() {
              @Override
              public void changed(ObservableValue observableValue, Object o, Object t1) {
                  CheckBoxTreeItem<File> node = (CheckBoxTreeItem<File>)t1;
                   if (node.getValue() != currentFile) {
                      setFileDetail(node);
                      showChildren(node);
                  }
              }
          });
          treeView.setCellFactory(new CallBackWrapper());
          treeView.setShowRoot(false);
      

      下面显示 CallBackWrapper 类。

      private class CallBackWrapper implements Callback<TreeView<File>, TreeCell<File>> {
      
          Callback<TreeView<File>, TreeCell<File>> theCallback;
      
          private CallBackWrapper() {
              theCallback = CheckBoxTreeCell.<File>forTreeView(getSelectedProperty, converter);
          }
      
          @Override
          public TreeCell<File> call(TreeView<File> fileTreeView) {
              return theCallback.call(fileTreeView);
          }
      
          final Callback<TreeItem<File>, ObservableValue<Boolean>> getSelectedProperty = (TreeItem<File> item) -> {
                  if (item instanceof CheckBoxTreeItem<?>) {
                      return ((CheckBoxTreeItem<?>) item).selectedProperty();
                  }
                  return null;
              };
          final StringConverter<TreeItem<File>> converter = new StringConverter<TreeItem<File>>() {
      
                  @Override
                  public String toString(TreeItem<File> object) {
                      File item = object.getValue();
                      return fileSystemView.getSystemDisplayName(item);
                  }
      
                  @Override
                  public TreeItem<File> fromString(String string) {
                      return new TreeItem<File>(new File(string));
                  }
          };
      }
      

      最后这里是一些选择的代码:

      boolean selectNode(CheckBoxTreeItem<File> parentNode, String name) {
          Object[]  children = parentNode.getChildren().toArray();
          for (Object child : children) {
              CheckBoxTreeItem<File> childItem = (CheckBoxTreeItem<File>) child;
              if (name.equals(childItem.getValue().getName())) {
                  childItem.setSelected(true);
                  //treeView.getSelectionModel().select(child); <-- this does not work!
                  return true;
              }
          }
          return false;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-08-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-25
        • 2015-06-30
        • 2018-01-18
        • 2021-06-22
        相关资源
        最近更新 更多