如何根据树的级别在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
的类别并从其他子列表中生成站点名称?
提前谢谢您。