Как отобразить различную информацию об объекте в ячейке 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
категории, а также генерировать имена сайтов из какого-либо другого подсписка?
Заранее спасибо.