Hi,
ich versuche gerade, mich in Swing einzuarbeiten und habe mir dazu überlegt, einen eigenen Dateiexplorer zu schreiben, weil mir das wie ein gutes Beispiel aussieht
Dabei bin ich auf ein kleines Problem gestoßen:
Ich habe mir ein eigenes TreeModel und einen eigenen TreeNode gebaut. Source siehe unten. Wenn ich das ganze jetzt auf ein Panel packe, welches wiederum Teil eines JFrames ist, werden mir bei den Nodes immer die absoluten Pfade angezeigt, obwohl ich in meiner TreeNode Klasse die toString()-Methode überschrieben habe. Irgendetwas scheine ich noch verkehrt zu machen. Kann mal bitte irgendwer über meine Klassen schauen und mir den entscheidenen Tipp geben?
Danke und wunderschönes Wochenende,
Andreas
Hier der Source. Zunächst die TreeNode Klasse:
Und nun das Model:
ich versuche gerade, mich in Swing einzuarbeiten und habe mir dazu überlegt, einen eigenen Dateiexplorer zu schreiben, weil mir das wie ein gutes Beispiel aussieht
Dabei bin ich auf ein kleines Problem gestoßen:
Ich habe mir ein eigenes TreeModel und einen eigenen TreeNode gebaut. Source siehe unten. Wenn ich das ganze jetzt auf ein Panel packe, welches wiederum Teil eines JFrames ist, werden mir bei den Nodes immer die absoluten Pfade angezeigt, obwohl ich in meiner TreeNode Klasse die toString()-Methode überschrieben habe. Irgendetwas scheine ich noch verkehrt zu machen. Kann mal bitte irgendwer über meine Klassen schauen und mir den entscheidenen Tipp geben?
Danke und wunderschönes Wochenende,
Andreas
Hier der Source. Zunächst die TreeNode Klasse:
Java:
package de.andreasgrund.fileexplorer.model;
import java.io.File;
import java.util.Collections;
import java.util.Enumeration;
import java.util.Iterator;
import java.util.SortedSet;
import java.util.TreeSet;
import javax.swing.tree.TreeNode;
import de.andreasgrund.fileexplorer.model.util.FileComparator;
public class FileTreeNode implements TreeNode {
private File internal;
private SortedSet<FileTreeNode> children;
public FileTreeNode(File internal) {
this.internal = internal;
initChildren();
}
private void initChildren() {
java.io.File[] listFiles = internal.listFiles();
children = new TreeSet<FileTreeNode>(new FileComparator());
if (listFiles != null) {
for (java.io.File file : listFiles) {
children.add(new FileTreeNode(file));
}
}
}
/**
* @see javax.swing.tree.TreeNode#children()
*/
@Override
public Enumeration<?> children() {
return Collections.enumeration(children);
}
@Override
public boolean getAllowsChildren() {
return internal.isDirectory();
}
@Override
public TreeNode getChildAt(int childIndex) {
Iterator<FileTreeNode> iterator = children.iterator();
for (int i = 0; i <= childIndex && iterator.hasNext(); i++) {
FileTreeNode file = iterator.next();
if (i == childIndex) {
return file;
}
}
return null;
}
@Override
public int getChildCount() {
return children.size();
}
@Override
public int getIndex(TreeNode node) {
if (!children.contains(node)) {
return 0;
} else {
FileComparator comparator = new FileComparator();
FileTreeNode incoming = (FileTreeNode) node;
int i = 0;
for (FileTreeNode child : children) {
if (comparator.compare(incoming, child) == 0) {
return i;
}
i++;
}
}
return 0;
}
@Override
public TreeNode getParent() {
return new FileTreeNode(internal.getParentFile());
}
@Override
public boolean isLeaf() {
return internal.listFiles().length == 0;
}
public File getFile() {
return internal;
}
@Override
public String toString() {
return internal.getName();
}
}
Und nun das Model:
Java:
package de.andreasgrund.fileexplorer.model;
import java.io.File;
import java.util.Arrays;
import java.util.List;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreeModel;
import javax.swing.tree.TreeNode;
public class FileTreeModel extends DefaultTreeModel implements TreeModel {
/**
*
*/
private static final long serialVersionUID = 6781409393613725593L;
private File rootFile;
public FileTreeModel(File rootFile, TreeNode node) {
super(node);
this.rootFile = rootFile;
}
public FileTreeModel(File rootFile, TreeNode root,
boolean asksAllowsChildren) {
super(root, asksAllowsChildren);
this.rootFile = rootFile;
}
@Override
public Object getChild(Object file, int index) {
if (!(file instanceof File)) {
return null;
}
File[] children = ((File) file).listFiles();
return children[index];
}
@Override
public int getChildCount(Object file) {
if (!(file instanceof File)) {
return 0;
}
return ((File) file).listFiles().length;
}
@Override
public int getIndexOfChild(Object parent, Object child) {
if (!(parent instanceof File) && !(child instanceof File)) {
return 0;
} else {
File[] children = ((File) parent).listFiles();
List<File> childrenList = Arrays.asList(children);
return childrenList.indexOf(child);
}
}
@Override
public Object getRoot() {
return rootFile;
}
@Override
public boolean isLeaf(Object file) {
if (!(file instanceof File)) {
return true;
} else {
File[] listFiles = ((File) file).listFiles();
if (listFiles == null) {
return true;
} else {
return listFiles.length == 0;
}
}
}
}