First of all sorry about my english. So, i have some problems with my JTree because i want to filter specific types of images and also i want to use icons of FileSystemView class. Can you help me? I will appreciate so much.
Here is my code:
import java.awt.BorderLayout;
import java.io.File;
import java.util.Iterator;
import java.util.Vector;
import javax.swing.JPanel;
import javax.swing.JTree;
import javax.swing.event.TreeModelEvent;
import javax.swing.event.TreeModelListener;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.TreeModel;
import javax.swing.tree.TreePath;
public class ArbolDirectorio extends JPanel
{
private JTree fileTree;
private FileSystemModel fileSystemModel;
public ArbolDirectorio(String directory)
{
this.setLayout(new BorderLayout());
this.fileSystemModel = new FileSystemModel(new File(directory));
this.fileTree = new JTree(fileSystemModel);
this.fileTree.setEditable(true);
this.fileTree.addTreeSelectionListener(new TreeSelectionListener()
{
@Override
public void valueChanged(TreeSelectionEvent event)
{
File file = (File) fileTree.getLastSelectedPathComponent();
System.out.println(getFileDetails(file));
}
});
this.add(fileTree, BorderLayout.CENTER);
}
private String getFileDetails(File file)
{
if (file == null)
{
return "";
}
StringBuffer buffer = new StringBuffer();
buffer.append("Name: " + file.getName() + "\n");
buffer.append("Path: " + file.getPath() + "\n");
return buffer.toString();
}
}
class FileSystemModel implements TreeModel
{
private File root;
private Vector listeners = new Vector();
public FileSystemModel(File rootDirectory)
{
root = rootDirectory;
}
@Override
public Object getRoot()
{
return root;
}
@Override
public Object getChild(Object parent, int index)
{
File directory = (File) parent;
String[] children = directory.list();
return new TreeFile(directory, children[index]);
}
@Override
public int getChildCount(Object parent)
{
File file = (File) parent;
if (file.isDirectory())
{
String[] fileList = file.list();
if (fileList != null)
{
return file.list().length;
}
}
return 0;
}
@Override
public boolean isLeaf(Object node)
{
File file = (File) node;
return file.isFile();
}
@Override
public int getIndexOfChild(Object parent, Object child)
{
File directory = (File) parent;
File file = (File) child;
String[] children = directory.list();
for (int i = 0; i < children.length; i++)
{
if (file.getName().equals(children[i]))
{
return i;
}
}
return -1;
}
@Override
public void valueForPathChanged(TreePath path, Object value)
{
File oldFile = (File) path.getLastPathComponent();
String fileParentPath = oldFile.getParent();
String newFileName = (String) value;
File targetFile = new File(fileParentPath, newFileName);
oldFile.renameTo(targetFile);
File parent = new File(fileParentPath);
int[] changedChildrenIndices = { getIndexOfChild(parent, targetFile) };
Object[] changedChildren = { targetFile };
fireTreeNodesChanged(path.getParentPath(), changedChildrenIndices, changedChildren);
}
private void fireTreeNodesChanged(TreePath parentPath, int[] indices, Object[] children)
{
TreeModelEvent event = new TreeModelEvent(this, parentPath, indices, children);
Iterator iterator = listeners.iterator();
TreeModelListener listener = null;
while (iterator.hasNext())
{
listener = (TreeModelListener) iterator.next();
listener.treeNodesChanged(event);
}
}
@Override
public void addTreeModelListener(TreeModelListener listener)
{
listeners.add(listener);
}
@Override
public void removeTreeModelListener(TreeModelListener listener)
{
listeners.remove(listener);
}
private class TreeFile extends File
{
public TreeFile(File parent, String child)
{
super(parent, child);
}
@Override
public String toString()
{
return getName();
}
}
}