Hallo Freunde,
wenn ich das mit Documents (Windows-Benutzer-Ordner) mit 30 Gigabyte aufrufe, dann funktioniert alles… Wenn ich es aber für den Benutzer-Ordner aufrufe mit ca. 300 Gigabyte, dann raff ich’s nicht und kriege eine NPE… Schaut euch das mal an.
Als UserObject
für DefaultMutableTreeNode
die Klasse Datei
:
class Datei implements Comparable<Datei>, Serializable {
File f;
long size;
@Override
public int compareTo(Datei d) {
return Long.compare(d.size, size);
}
@Override
public String toString() {
return String.format(Locale.GERMAN, "%1$,.2f", (double) size / (1024 * 1024)) + " - " + f.getName();
}
}
Und so setze ich den root
DefaultMutableTreeNode
zusammen:
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Enumeration;
import java.util.Locale;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreePath;
import org.apache.commons.compress.archivers.sevenz.SevenZArchiveEntry;
import org.apache.commons.compress.archivers.sevenz.SevenZOutputFile;
public class BU2 {
public static void main(String[] args) throws IOException {
ArrayList<DefaultMutableTreeNode> dateien = new ArrayList<>();
JFileChooser jfc = new JFileChooser();
jfc.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
jfc.setMultiSelectionEnabled(true);
while (jfc.showOpenDialog(null) == JFileChooser.APPROVE_OPTION) {
File[] fs1 = jfc.getSelectedFiles();
for (File f : fs1) {
DefaultMutableTreeNode d = new DefaultMutableTreeNode();
addDatei(d, f);
dateien.add(d);
JOptionPane.showMessageDialog(null, f + " mit " + d.getUserObject());
}
}
// ...
}
Ich kriege eine NPE bei Collections.sort
in addDatei
und ich raffs nicht:
static long addDatei(DefaultMutableTreeNode parent, File file) {
if (file != null && file.canRead()) {
Datei d = new Datei();
d.f = file;
parent.setUserObject(d);
if (file.isFile()) {
d.size = file.length();
}
File[] fs = file.listFiles();
if (fs != null && fs.length > 0) {
for (File f : fs) {
DefaultMutableTreeNode c = new DefaultMutableTreeNode();
d.size += addDatei(c, f);
parent.add(c);
}
ArrayList<DefaultMutableTreeNode> cs1 = new ArrayList<>();
Enumeration cs2 = parent.children();
while (cs2.hasMoreElements()) {
cs1.add((DefaultMutableTreeNode) cs2.nextElement());
}
Collections.sort(cs1, (DefaultMutableTreeNode o1, DefaultMutableTreeNode o2) -> ((Datei) o1.getUserObject()).compareTo((Datei) o2.getUserObject()));
parent.removeAllChildren();
for (int i = 0; i < cs1.size(); i++) {
parent.add(cs1.get(i));
}
}
return d.size;
}
return 0;
}
Später ist dann angedacht, ein JTree anzuzeigen:
JFrame jf = new JFrame();
DefaultTreeModel model = new DefaultTreeModel(dateien.get(0));
JTree jt = new JTree(model);
jf.add(new JScrollPane(jt));
jf.setSize(800, 800);
jf.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
jf.setVisible(true);
jt.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if (e.getClickCount() == 2) {
TreePath tpath = jt.getPathForLocation(e.getX(), e.getY());
DefaultMutableTreeNode node = (DefaultMutableTreeNode) tpath.getLastPathComponent();
Datei d = (Datei) node.getUserObject();
d.f = null;
node.setUserObject(null);
model.removeNodeFromParent(node);
}
}
});
Danke.