Как отобразить различную информацию на основе уровня дерева в ControlsFX CheckTreeView? - PullRequest
0 голосов
/ 09 июня 2019

Как отобразить различную информацию об объекте в ячейке TreeView в зависимости от уровня дерева?

Этот вопрос может показаться похожим на этот , но этоЭто не так, как у меня есть только 1 объект.

В этом примере используется Библиотека ControlsFX - (JavaDoc) , но я считаю, что вопрос также имеет отношение к обычному TreeView.ControlsFX предоставляет только встроенные опции-флажки, поэтому не стесняйтесь давать ответ независимо от того, CheckTreeView или TreeView.

У меня есть класс Site, в котором он имеетОбе строки я хотел бы сделать на основе уровня дерева.

Я хотел бы показать CheckTreeView как это:

  • Категория сайта
    • Название сайта
    • Название сайта
    • Название сайта
  • Категория сайта
    • Название сайта
    • СайтИмя
    • ...
  • ...

Как мне это сделать, сохранив объект CheckTreeView как сайткласс, а не String?

Прямо сейчас у меня есть его как Strings, но мне нужно, чтобы он содержал объект 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());
      }
     });

    ...
  }
}


Подвопрос:

Можно ли создать фабрику ячеек для списка 1-го уровня так, чтобы она отображала Siteкатегории, а также генерировать имена сайтов из какого-либо другого подсписка?

Заранее спасибо.

...