의견에서 지적한대로 documentation for TreeItem
에는 트리 항목의 자식 노드가 지연 채워지는 예제가 있습니다.
다음은 무한 트리 테이블의 아주 간단한 예입니다. 이 예제에서 트리 항목이 축소되면 가비지 수집 될 수 있도록 자식 노드가 제거됩니다.
import java.math.BigInteger;
import java.util.function.Function;
import javafx.application.Application;
import javafx.beans.property.SimpleObjectProperty;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.control.TreeItem;
import javafx.scene.control.TreeTableColumn;
import javafx.scene.control.TreeTableView;
import javafx.stage.Stage;
public class UnlimitedTreeTableView extends Application {
@Override
public void start(Stage primaryStage) {
TreeTableView<Item> treeTable = new TreeTableView<>();
treeTable.setRoot(createTreeItem(BigInteger.ZERO));
treeTable.getColumns().add(column("Item", Item::getName));
treeTable.getColumns().add(column("Value", Item::getValue));
primaryStage.setScene(new Scene(treeTable));
primaryStage.show();
}
private TreeItem<Item> createTreeItem(BigInteger value) {
TreeItem<Item> item = new TreeItem<Item>(new Item(String.format("Item %,d", value), value)) {
private boolean childrenComputed = false ;
{
expandedProperty().addListener((obs, wasExpanded, isNowExpanded) -> {
if (! isNowExpanded) { // remove child nodes...
super.getChildren().clear();
childrenComputed = false ;
}
});
}
@Override
public ObservableList<TreeItem<Item>> getChildren() {
if (! childrenComputed) {
Item item = getValue();
BigInteger value = item.getValue() ;
BigInteger valueTimes10 = value.multiply(BigInteger.TEN);
for (int i = 0 ; i < 10 ; i++) {
BigInteger v = BigInteger.valueOf(i);
super.getChildren().add(createTreeItem(valueTimes10.add(v)));
}
childrenComputed = true ;
}
return super.getChildren();
}
@Override
public boolean isLeaf() {
return false ;
}
};
return item ;
}
private static <S,T> TreeTableColumn<S,T> column(String title, Function<S,T> property) {
TreeTableColumn<S,T> column = new TreeTableColumn<>(title);
column.setCellValueFactory(cellData ->
new SimpleObjectProperty<T>(property.apply(cellData.getValue().getValue())));
column.setPrefWidth(200);
return column ;
}
public static class Item {
private final BigInteger value ;
private final String name ;
public Item(String name, BigInteger value) {
this.name = name ;
this.value = value ;
}
public BigInteger getValue() {
return value;
}
public String getName() {
return name;
}
}
public static void main(String[] args) {
launch(args);
}
}
의
가능한 복제 [자바 FX 나쁜 디자인 :?를있는 TableView 뒤에 관찰 목록에있는 행의 정체성 (http://stackoverflow.com/questions/36937118/javafx-bad-design-row-identity-in-observable -lists-behind-the tableview) – Itai
위의 링크 된 질문은 'TableView'를 참조하지만, 동일한 문제입니다. 나는 James_D의 대답이'TreeTableView'에도 적용될 수 있다고 믿는다. – Itai
TreeItem의 javadoc을 읽으십시오. 파일 시스템 브라우저를 예로 들면, 노드의 주문형로드 (on-demand loading) 구현에 대한 전체 섹션이 있습니다 (무한하지 않을 수도 있지만, 전체 파일 시스템을 메모리로 끌어 오지 않고 필요한 것만로드하려고합니다). –