Step to produce the bug
- Run this code
- Expand the root node, if not expanded
- Collapse the root node
- More folders (like subfolders) will appear at the end of the window
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Arrays;
import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.TreeCell;
import javafx.scene.control.TreeItem;
import javafx.scene.control.TreeView;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;
import javafx.util.Callback;
public class Main extends Application {
Pane box;
TreeView<String> treeView;
@Override
public void start(Stage stage) {
TreeItem<String> root = new TreeItem<>("Root");
traverse("a folder path", root);
root.setExpanded(true);
treeView = new TreeView<String>(root);
treeView.setShowRoot(true);
treeView.setEditable(true);
treeView.setPrefSize(500, 800);
treeView.setCellFactory(new Callback<TreeView<String>, TreeCell<String>>() {
@Override
public TreeCell<String> call(TreeView<String> paramP) {
return new TreeCell<String>() {
@Override
protected void updateItem(String paramT, boolean paramBoolean) {
super.updateItem(paramT, paramBoolean);
if (!isEmpty()) {
setGraphic(new Label(paramT, (Node) importImage("image path")));
setOnMouseClicked(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent event) {
P.print(paramT);
P.print(treeView.getChildrenUnmodifiable().size());
}
});
}
}
};
}
});
box = new Pane();
box.getChildren().add(treeView);
box.setPrefSize(500, 800);
Scene scene = new Scene(box, 500, 800);
stage.setTitle("Tree View Sample");
stage.setScene(scene);
stage.show();
}
public void traverse(String path, TreeItem<String> root) {
File file = new File(path);
if (!file.isDirectory() || !Files.isReadable(Paths.get(path)))
return;
Arrays.asList(file.listFiles()).forEach(e -> {
TreeItem<String> temp = new TreeItem<>(e.getName());
root.getChildren().add(temp);
traverse(e.getPath(), temp);
});
}
public static ImageView importImage(String path) {
ImageView image = new ImageView(new Image(path));
image.setPreserveRatio(true);
image.setFitHeight(20);
return image;
}
public static void main(String[] args) {
launch(args);
}
}