我有TreeTableView与项目。我希望用户看到“箭头”展开,即使项目没有孩子。原因很简单-延迟加载。当用户点击箭头程序检查是否有可能的项目(例如在数据库中)。如果孩子为这个项目存在,那么他们被添加到项目。如果他们不存在,“箭头”必须消失。如何做到这一点?
eqqqjvef1#
Javadocs for TreeItem展示了一个基本上做到这一点的例子。你可以覆盖isLeaf和getChildren方法来延迟示例化孩子。下面是适用于TreeTableView的相同想法:
TreeItem
isLeaf
getChildren
TreeTableView
import java.util.ArrayList; import java.util.Arrays; import java.util.List; import javafx.application.Application; import javafx.beans.property.IntegerProperty; import javafx.beans.property.SimpleIntegerProperty; import javafx.beans.property.SimpleStringProperty; import javafx.beans.property.StringProperty; import javafx.collections.ObservableList; import javafx.event.Event; import javafx.scene.Scene; import javafx.scene.control.TreeItem; import javafx.scene.control.TreeTableColumn; import javafx.scene.control.TreeTableView; import javafx.scene.layout.BorderPane; import javafx.stage.Stage; public class LazyTreeTable extends Application { @Override public void start(Stage primaryStage) { TreeTableView<Item> treeTable = new TreeTableView<>(); TreeTableColumn<Item, String> nameCol = new TreeTableColumn<>("Name"); nameCol.setCellValueFactory(cellData -> cellData.getValue().getValue().nameProperty()); nameCol.setPrefWidth(250); TreeTableColumn<Item, Number> valueCol = new TreeTableColumn<>("Value"); valueCol.setCellValueFactory(cellData -> cellData.getValue().getValue().valueProperty()); valueCol.setPrefWidth(150); treeTable.getColumns().addAll(Arrays.asList(nameCol, valueCol)); treeTable.setRoot(new ItemTreeNode(new Item(1))); primaryStage.setScene(new Scene(new BorderPane(treeTable), 400, 600)); primaryStage.show(); } public static class ItemTreeNode extends TreeItem<Item> { private boolean childrenLoaded = false ; public ItemTreeNode(Item value) { super(value); } @Override public boolean isLeaf() { if (childrenLoaded) { return getChildren().isEmpty() ; } return false ; // return getChildren().isEmpty(); } @Override public ObservableList<TreeItem<Item>> getChildren() { if (childrenLoaded) { return super.getChildren(); } childrenLoaded = true ; if (getValue().getValue() < 100_000) { List<TreeItem<Item>> children = new ArrayList<>(); for (int i = 0 ; i < 10; i++) { children.add(new ItemTreeNode(new Item(getValue().getValue() * 10 + i))); } super.getChildren().addAll(children); } else { // great big hack: super.getChildren().add(null); super.getChildren().clear(); } return super.getChildren() ; } } public static class Item { private IntegerProperty value = new SimpleIntegerProperty(); private StringProperty name = new SimpleStringProperty(); public Item(String name, int value) { setName(name); setValue(value); } public Item(int value) { this(String.format("Item %,d", value), value); } public final IntegerProperty valueProperty() { return this.value; } public final int getValue() { return this.valueProperty().get(); } public final void setValue(final int value) { this.valueProperty().set(value); } public final StringProperty nameProperty() { return this.name; } public final java.lang.String getName() { return this.nameProperty().get(); } public final void setName(final java.lang.String name) { this.nameProperty().set(name); } } public static void main(String[] args) { launch(args); } }
字符串
3ks5zfa02#
对于任何在谷歌搜索如何让箭头显示在没有孩子的TreeItem上时发现这一点的人,这是我学到的。你所要做的就是调用TreeItem的isLeaf()方法,让它返回false,然后箭头就会出现。如果你想要一个只返回空TreeItem的方法,并且启用了箭头,你可以这样做(为了简单起见,我选择了String,但使用自定义类也很好):
private TreeItem<String> emptyArrowItem(String itemsString) { return new TreeItem<>(itemsString) { @Override public boolean isLeaf() { return false; } } }
字符串然而,如果你想为TreeItem使用一个自定义类,然后根据它是否是一个空的Item,使用该类显示展开箭头,你可以这样做:
private TreeItem<CustomTreeItem> createItem(final CustomTreeItem customTreeItem) { return new TreeItem<>(customTreeItem) { private boolean isLeaf; private boolean isFirstTimeLeaf = true; @Override public boolean isLeaf() { if (isFirstTimeLeaf) { isFirstTimeLeaf = false; CustomTreeItem cti = getValue(); isLeaf = cti.isEmptyItem(); } return isLeaf; } }; }
型这个例子直接来自the JavaDocs中给出的TreeItem类的例子,只是我简化了它,使它更容易理解。
2条答案
按热度按时间eqqqjvef1#
Javadocs for
TreeItem
展示了一个基本上做到这一点的例子。你可以覆盖isLeaf
和getChildren
方法来延迟示例化孩子。下面是适用于TreeTableView
的相同想法:字符串
3ks5zfa02#
对于任何在谷歌搜索如何让箭头显示在没有孩子的TreeItem上时发现这一点的人,这是我学到的。
你所要做的就是调用TreeItem的isLeaf()方法,让它返回false,然后箭头就会出现。
如果你想要一个只返回空TreeItem的方法,并且启用了箭头,你可以这样做(为了简单起见,我选择了String,但使用自定义类也很好):
字符串
然而,如果你想为TreeItem使用一个自定义类,然后根据它是否是一个空的Item,使用该类显示展开箭头,你可以这样做:
型
这个例子直接来自the JavaDocs中给出的TreeItem类的例子,只是我简化了它,使它更容易理解。