通过使用CheckBoxTreeItem
,我已经将自己缩进了一个角落,因为我想要它提供的功能(如果选中了父级的话,可以检查所有的子级),但是我的父母有一个Hyperlink
作为图形,而我的孩子有Strings
作为他们的图形。Java不喜欢包含两种不同类型的TreeView
(CheckBoxTreeItem<Hyperlink>
和CheckBoxTreeItem<String>
)。我的选项是创建一个接受泛型类型的TreeView
,或者找到一种将Hyperlinks
显示为纯文本的方法。我已经修改了几个小时的泛型类型选项,但似乎无法让它发挥作用。我更倾向于修改超链接,但无论是哪种方式,我都会得到很好的建议。
发布于 2016-11-25 01:31:06
如果要添加Node
类型,可以使用TreeItem
的graphic
属性。
@Override
public void start(Stage primaryStage) {
CheckBoxTreeItem<String> item = new CheckBoxTreeItem<>(null, new Hyperlink("abc"));
CheckBoxTreeItem<String> item2 = new CheckBoxTreeItem<>("Hello World");
CheckBoxTreeItem<String> item3 = new CheckBoxTreeItem<>("42");
item.getChildren().setAll(item2, item3);
TreeView<String> treeView = new TreeView<>(item);
treeView.setCellFactory(CheckBoxTreeCell.forTreeView());
Scene scene = new Scene(treeView);
primaryStage.setScene(scene);
primaryStage.show();
}
或者,如果TreeItem
值包含Node
,则需要稍微修改CheckBoxTreeCell
的updateItem
方法:
CheckBoxTreeItem<Object> item = new CheckBoxTreeItem<>(new Hyperlink("abc"));
CheckBoxTreeItem<Object> item2 = new CheckBoxTreeItem<>("Hello World");
CheckBoxTreeItem<Object> item3 = new CheckBoxTreeItem<>("42");
CheckBoxTreeItem<Object> item4 = new CheckBoxTreeItem<>(new Hyperlink("def"));
item.getChildren().setAll(item2, item3, item4);
TreeView<Object> treeView = new TreeView<>(item);
treeView.setCellFactory(tv -> new CheckBoxTreeCell<Object>() {
private final HBox graphicWrapper = new HBox();
{
graphicWrapper.setAlignment(Pos.BASELINE_LEFT);
}
@Override
public void updateItem(Object item, boolean empty) {
graphicWrapper.getChildren().clear();
super.updateItem(item, empty);
if (!empty && (item instanceof Node)) {
// replace graphic & text
setText(null);
graphicWrapper.getChildren().setAll(getGraphic(), (Node) item);
setGraphic(graphicWrapper);
}
}
});
https://stackoverflow.com/questions/40798057
复制