如何在ControlsFX CheckTreeView中基于树级别显示不同的信息?

时间:2019-06-08 23:30:47

标签: java javafx treeview controlsfx

如何根据树的级别在TreeView单元中呈现对象的不同信息?

这个问题似乎类似于this one,但不是,因为我只有1个对象。

此示例使用的是ControlsFX library-(JavaDoc),但我认为该问题也与常规TreeView有关。 ControlsFX仅提供内置的复选框选项,因此无论是CheckTreeView还是TreeView,都可以随意给出答案。

我有一个Site类,其中有两个我想基于树级别呈现的字符串。

我想显示一个CheckTreeView

  • 网站的类别
    • 站点名称
    • 站点名称
    • 站点名称
  • 网站的类别
    • 站点名称
    • 站点名称
    • ...
  • ...

在将CheckTreeView的Object保留为Site类而不是String的同时该怎么做?

现在我将其作为字符串使用,但是我需要它包含对象Site,因为稍后我会对其进行处理(这更加复杂,我只显示必要的部分):


网站课程:

public class Site {

  private String siteName;

  private String category;

  public String getSiteName() {
    return siteName;
  }

  public void setSiteName(String siteName) {
    this.siteName = siteName;
  }

  public String getSiteCategory() {
    return category;
  }

  public void setSiteCategory(String classification) {
    this.category = classification;
  }

}


SitesManager类:(它的站点列表始终是最新的)

public class SitesManager {

  private static ObjectProperty<SiteDTO> site =
      new SimpleObjectProperty<SiteDTO>();

  private static ListProperty<SiteDTO> sitesList =
      new SimpleListProperty<SiteDTO>();

  public static SiteDTO getSite() {
    return site.get();
  }

  public static ObjectProperty<SiteDTO> siteProperty() {
    return site;
  }

  public static void setSite(SiteDTO site) {
    SitesManager.site.set(site);
  }

  public static ObservableList<SiteDTO> getSitesList() {
    return sitesList.get();
  }

  public static ListProperty<SiteDTO> sitesListProperty() {
    return sitesList;
  }

  public static void setSitesList(ObservableList<SiteDTO> sitesList) {
    SitesManager.sitesList.set(sitesList);
  }

}


控制器类:

public class CustomerCityExplorerUIController {
  @FXML
  private CheckTreeView<String> sitesFilterTV;
  private CheckBoxTreeItem<String> dummyRoot = new CheckBoxTreeItem<>();

  @FXML
  private void initialize(){
    updateSites(SitesManager.sitesListProperty);
  }

  private void updateSites(List<Site> items) {
    Set<String> categoriesSet = new HashSet<>();
    for (Site site : items) {
      if (!categoriesSet.contains(site.getCategory())) {
        categoriesSet.add(site.getCategory());
      }
    }

    for (String category : categoriesSet) {
      CheckBoxTreeItem<String> categoryItem = new CheckBoxTreeItem<>(category);

      for (Site site : items) {
        if (site.getCategory() == category) {
          CheckBoxTreeItem<String> siteItem = new CheckBoxTreeItem<>(site.getSiteName());

          siteItem.selectedProperty().addListener((observable, oldValue, newValue) -> {
            // do something .. so I want the item to be Site and not String
          });
          categoryItem.getChildren().add(siteItem);
        }
      }

      categoryItem.setSelected(true);

      dummyRoot.getChildren().add(categoryItem);
    }
    sitesFilterTV.setRoot(dummyRoot);
    sitesFilterTV.setShowRoot(false);
  }

}


我希望能够做类似的事情:

public class CustomerCityExplorerUIController {
  @FXML
  private CheckTreeView<String> sitesFilterTV;
  private CheckBoxTreeItem<String> dummyRoot = new CheckBoxTreeItem<>();

  @FXML
  private void initialize(){

    sitesFilterTV.setRoot(dummyRoot);
    sitesFilterTV.setShowRoot(false);

    sitesFilterTV.setCellFactory(p -> new CheckBoxTreeCell<String>() {
      @Override
      public void updateItem(String item, boolean empty) {
        super.updateItem(item, empty);
        if(thisIsFirstLevel)
          setText(empty ? "" : item.getSiteCategory());
        else
          setText(empty ? "" : item.getSiteName());
      }
     });

    ...
  }
}


子问题:

是否可以为第一级列表创建一个单元工厂,使其呈现Site的类别并从其他子列表中生成站点名称?

提前谢谢您。

0 个答案:

没有答案