Cześć
Mam problem ze zrozumieniem fragmentu kodu zaznaczonego na czerwono:
Z góry dziex za pomoc
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.io.File;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeCellRenderer;
public class T1 {
public static void main(String[] args) {
JFrame f = new JFrame();
f.setSize(new Dimension(300,400));
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JTree tree = new JTree();
FileTreeModel model = new FileTreeModel();
tree.setModel(model);
tree.addTreeWillExpandListener(model);
tree.setCellRenderer(new DefaultTreeCellRenderer(){
// renderer wyswietlajacy tylko nazwy plikow a nie pelne sciezki
public java.awt.Component
getTreeCellRendererComponent(JTree tree,Object value,boolean sel,boolean expanded,boolean leaf,int row,boolean hasFocus)
{
if (value instanceof DefaultMutableTreeNode &&
((DefaultMutableTreeNode) value).getUserObject() instanceof File) {
String name = ((File) ((DefaultMutableTreeNode)
value).getUserObject()).getName();
value = name.length() == 0 ? ((DefaultMutableTreeNode)
value).getUserObject() : name;
}
return super.getTreeCellRendererComponent(tree, value, sel, expanded,
false, row, hasFocus);
}
});
f.getContentPane().add(new JScrollPane(tree), BorderLayout.CENTER);
f.setVisible(true);
}
}
import java.io.File;
import java.io.FileFilter;
import java.util.Arrays;
import java.util.Comparator;
import javax.swing.event.TreeExpansionEvent;
import javax.swing.event.TreeWillExpandListener;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.ExpandVetoException;
public class FileTreeModel extends DefaultTreeModel implements
TreeWillExpandListener {
private static final long serialVersionUID = 3258410612462990384L;
/**
- Pozwala sortowac pliki najpier katalogi, potem pliki i alfabetycznie.
- Bardziej uniwersalne niz potrzeba, bo bylo pisane przed ograniczeniem
- do katalogow
/
private static final Comparator<File> FILE_COMPARATOR = new Comparator<File>() {
public int compare(File f1, File f2) {
if (f1.isDirectory() && !f2.isDirectory()) return -1;
if (!f1.isDirectory() && f2.isDirectory()) return 1;
return f1.getName().toLowerCase().compareTo(f2.getName(). toLowerCase());
}
};
/* - Wybiera tylko katalogi
/
private static final FileFilter FILE_FILTER = new FileFilter() {
public boolean accept(File pathname) {
return pathname.isDirectory();
}
};
/* - Wczytanie pocztkowych potrzebnych danych
/
public FileTreeModel() {
super(new DefaultMutableTreeNode("Komputer", true));
DefaultMutableTreeNode rootNode = (DefaultMutableTreeNode) getRoot();
for (File f : File.listRoots()) {
DefaultMutableTreeNode node = new DefaultMutableTreeNode(f, true);
rootNode.add(node);
// zaglebienie sie o jeden dalej niz wyswietlenie. Dzieki
// temu drzewo pozwala sie rozwijac
addFile(node);
}
}
/* - Dodanie kolejnych dzieci do drzewa
*/
private void addFile(DefaultMutableTreeNode root) {
// ale tylko wtedy gdy jeszcze nie jest wczytane, bo moze byc tak
// ze juz jest i nie trzeba
if (root.getUserObject() instanceof File && root.getChildCount() == 0) {
File f = (File) root.getUserObject();
if (f.isDirectory()) {
File[] files = f.listFiles(FILE_FILTER);
if(files != null){
for (File file : files) root.add(new DefaultMutableTreeNode(file,
true));
}
}
}
}
public void treeWillExpand(TreeExpansionEvent event) throws
ExpandVetoException {
// pobieramy node ktore ma byc rozwiniete
DefaultMutableTreeNode node = (DefaultMutableTreeNode)
event.getPath().getLastPathComponent();
// wczytujemy o jedno zaglebienie dalej niz bedzie rozwiniecie, czyli
// dla wszystkie dzieci rozwijanego dowiaduja sie co jest ponizej nich
for (int i = 0, n = node.getChildCount(); i < n; i++)
addFile((DefaultMutableTreeNode) node.getChildAt(i));
}
public void treeWillCollapse(TreeExpansionEvent event) throws
ExpandVetoException {
// nic nie robimy, zwalnianie pamieci nalezy robic nie tutaj, ale
// w TreeExpansionListener, juz po zwinieciu widoku
}
}