You are here

JavaFX 2.0 Laufwerks- und Verzeichnisbaum im TreeView

Basierend auf einem DynamicTree-Example aus dem Netz (Quelle leider by now nicht mehr gefunden) habe ich eine JavaFX 2.0 Applikation erstellt, welche Laufwerke und Verzeichnisbaum aller lokalen Datenträger als TreeView darstellt. Da ich von der öffentlichen Grundlage im Netz profitiert habe, gebe ich hiermit gerne meine entsprechenden Anpassungen ebenfalls öffentlich weiter. Natürlich ist einiges noch verbesserungswürdig, aber es funktioniert immerhin schon mal...
Wer sich hineindenkt, wird erkennen, wo man zB. ein Startverzeichnis als Parameter mitgeben kann, wie und wo einige zusätzliche Laufwerks-/Verzeichnis-/Datei-Informationen zu gewinnen sind, oder wie/wo ein Listener einzuhängen ist um eine Aktion auf ein Laufwerk / ein Verzeichnis / eine Datei aufzurufen.

Viel Spaß und viel Erfolg!
PS: Wer die Quelle zufällig kennt oder entdeckt, bitte Nachricht an mich!
Ich möchte die ursprüngliche Quelle gerne hier nennen.

-----------------------------------------------------------------------------------------------

package dirtreeview;

import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Random;
import javafx.application.Application;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.TreeItem;
import javafx.scene.control.TreeItem.TreeModificationEvent;
import javafx.scene.control.TreeView;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

/**
*
* @author Andy
*/
public class DirTreeView extends Application {

/**
* @param args the command line arguments
*/
public static void main(String[] args) {
Application.launch(args);
}

@Override
public void start(Stage primaryStage) {
primaryStage.setTitle("Example Directory Tree");
primaryStage.setResizable(true);
final VBox box = new VBox();
box.setFillWidth(true);
Scene scene = new Scene(box);
primaryStage.setScene(scene);
box.getChildren().add(this.getVolumeTree());
primaryStage.show();
}

private TreeView getVolumeTree() {
// DynamicTreeNodeModel rootNode = new DynamicDirTreeNodeModel(null, "Volumes on this machine", new File("C:\\."));
DynamicTreeNodeModel rootNode = new DynamicDirTreeNodeModel(null, "Volumes on this machine", null);
TreeView treeView = new TreeView();
treeView.setPrefSize(1000, 750);
TreeItem rootItem = new TreeItem(rootNode);
rootItem.addEventHandler(TreeItem.branchExpandedEvent(), new EventHandler>() {

public void handle(TreeModificationEvent event) {
// System.out.println("handling event " + event);
TreeItem item = event.getTreeItem();
DynamicTreeNodeModel node = item.getValue();
boolean isPopulated = node.isPopulated();
boolean areGrandChildrenPopulated = node.areChildenPopulated();
node.populateToDepth(2);
if (!isPopulated) {
for (DynamicTreeNodeModel childNode : node.getChildren()) {
TreeItem childItem = new TreeItem(childNode);
childItem.addEventHandler(TreeItem.branchExpandedEvent(), this);
item.getChildren().add(childItem);
}
}
if (!areGrandChildrenPopulated) {
int i = 0;
for (TreeItem childItem : item.getChildren()) {
// get cooresponding node in the model
DynamicTreeNodeModel childNode = node.getChildren().get(i);
i++;
for (DynamicTreeNodeModel grandChildNode : childNode.getChildren()) {
TreeItem grandChildItem = new TreeItem(grandChildNode);
grandChildItem.addEventHandler(TreeItem.branchExpandedEvent(), this);
childItem.getChildren().add(grandChildItem);
}
}
}
}
});
treeView.setShowRoot(true);
treeView.setRoot(rootItem);
rootItem.setExpanded(true);
// treeView.setCellFactory(new LearningTreeCellFactory());
return treeView;
}

private static interface DynamicTreeNodeModel {

public String getName();

public void setName(String name);

public boolean isPopulated();

public boolean areChildenPopulated();

public List getChildren();

public void setChildren(List children);

public DynamicTreeNodeModel getParent();

public void setParent(DynamicTreeNodeModel parent);

public void populateToDepth(int depth);

@Override
public String toString();
}

private static class DynamicDirTreeNodeModel implements DynamicTreeNodeModel {

private DynamicTreeNodeModel parent;
private String name;
private List children = null;
private List childfiles_all;
private File StartPoint;

public DynamicDirTreeNodeModel(DynamicTreeNodeModel parent, String name, File StartPoint) {
this.parent = parent;
this.name = name;
this.StartPoint = StartPoint;
this.childfiles_all = new ArrayList();
// this.childfiles_files = new ArrayList();
// this.childfiles_directories = new ArrayList();
if (!(StartPoint instanceof File)) {
for (File f : File.listRoots()) {
System.out.println(f.getAbsolutePath());
childfiles_all.add(f);
}
} else {
if (StartPoint.isDirectory()) {
try {
childfiles_all.addAll(Arrays.asList(StartPoint.listFiles()));
} catch (Exception nofiles) {
System.out.println("No Files for Volume " + StartPoint.getAbsolutePath());
}
}
}
/*
* for(File f :childfiles_all){ if (f.isDirectory()){
* childfiles_directories.add(f); } else { childfiles_files.add(f); }
* }
*/

}

@Override
public String getName() {
return name;
}

@Override
public void setName(String name) {
this.name = name;
}

@Override
public boolean isPopulated() {
if (children == null) {
return false;
}
return true;
}

@Override
public boolean areChildenPopulated() {
if (!this.isPopulated()) {
return false;
}
for (DynamicTreeNodeModel child : this.children) {
if (!child.isPopulated()) {
return false;
}
}
return true;
}

@Override
public List getChildren() {
return children;
}

@Override
public void setChildren(List children) {
this.children = children;
}

@Override
public DynamicTreeNodeModel getParent() {
return parent;
}

@Override
public void setParent(DynamicTreeNodeModel parent) {
this.parent = parent;
}
private static Random random = new Random();

@Override
public void populateToDepth(int depth) {
if (depth return;
}
if (children == null) {
children = new ArrayList();
for (File f : childfiles_all) {
//Directories only - these FIRST
if (f.isDirectory()) {
if (f.getName().isEmpty()) {
children.add(new DynamicDirTreeNodeModel(this, f.getAbsolutePath(), f));
} else {
children.add(new DynamicDirTreeNodeModel(this, f.getName(), f));
}
}
//Files - these SECOND
/*if (!f.isDirectory()) {
if (f.getName().isEmpty()) {
children.add(new DynamicDirTreeNodeModel(this, f.getAbsolutePath(), f));
} else {
children.add(new DynamicDirTreeNodeModel(this, f.getName(), f));
}
}*/

}
}

int childdepth = depth - 1;
for (DynamicTreeNodeModel child : children) {
child.populateToDepth(childdepth);
}
}

@Override
public String toString() {
return this.name;
}
}
}

-----------------------------------------------------------------------------------------------