B
Beni
Gast
JTree - Anwendung 1 - Ein DirectoryChooser
Der folgende Code wurde von Roar geschrieben:
Hier könnte noch ein bisschen Text stehen... Roar? :-D
Der folgende Code wurde von Roar geschrieben:
Hier könnte noch ein bisschen Text stehen... Roar? :-D
Java:
package tests.swing;
import java.io.File;
import java.io.FileFilter;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import javax.swing.JTree;
import javax.swing.event.TreeExpansionEvent;
import javax.swing.event.TreeWillExpandListener;
import javax.swing.filechooser.FileSystemView;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.TreePath;
import javax.swing.tree.TreeSelectionModel;
public class FileTree extends JTree implements TreeWillExpandListener {
private static class FileComparator implements Comparator<File> {
public int compare(File f1, File f2) {
if(f1.isDirectory() ^ f2.isDirectory()) {
return (f1.isDirectory() ? -1 : 1);
}
return f1.getName().compareToIgnoreCase(f2.getName());
}
}
private static class DirectoryFilter implements FileFilter {
public boolean accept(File f) {
return f.isDirectory();
}
}
private static class AcceptAllFilter implements FileFilter {
public boolean accept(File f) {
return true;
}
}
private static final Comparator<File> FILE_COMPARATOR = new FileComparator();
/** Ein FileFilter, der nur Verzeichnisse akzeptiert */
public static final FileFilter DIRECTORY_FILTER = new DirectoryFilter();
/** Ein FileFilter der alle Typen von Dateien und Verzeichnisse akzeptiert */
public static final FileFilter ACCEPT_ALL_FILTER = new AcceptAllFilter();
/** Der aktuelle FileFilter */
protected FileFilter filter = null;
public FileTree() {
// Home Verzeichnis feststellen
File homeDir = FileSystemView.getFileSystemView().getHomeDirectory();
// Wurzelelement erstellen
DefaultMutableTreeNode root = new DefaultMutableTreeNode(homeDir);
// Model erstellen mit root als Wurzelelement
DefaultTreeModel model = new DefaultTreeModel(root);
setModel(model);
setShowsRootHandles(true);
// TreeCellRenderer setzen.
setCellRenderer(new FileTreeRenderer());
// Wurzel aufklappen
expandPath(root);
// Listener hinzufügen
addTreeWillExpandListener(this);
// und so ...
getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
}
/**
* Erweitert einen Pfad im Tree.
*
* @param d Den Parent Knoten
*/
private void expandPath(final DefaultMutableTreeNode d) {
d.removeAllChildren();
File[] tempf = ((File) d.getUserObject()).listFiles();
List<File> files = Arrays.asList(tempf);
Collections.sort(files, FILE_COMPARATOR);
DefaultMutableTreeNode temp = null;
for(File file: files) {
if(filter != null && !filter.accept(file))
continue;
temp = new DefaultMutableTreeNode(file);
if(file.isDirectory())
temp.add(new DefaultMutableTreeNode(null));
d.add(temp);
}
((DefaultTreeModel) getModel()).reload(d);
}
/**
* Setzt den FileFilter und setzt den Tree zurück.
*
* @param f Der neue FileFilter
*/
public void setFileFilter(FileFilter f) {
filter = f;
expandPath((DefaultMutableTreeNode) getModel().getRoot());
}
/**
* Liefert den aktuell gesetzten FileFilter zurück
* @return Den FileFilter
*/
public FileFilter getFileFilter() {
return filter;
}
public File getSelectedFile() {
TreePath selectionPath = getSelectionPath();
if(selectionPath == null)
return null;
DefaultMutableTreeNode node = (DefaultMutableTreeNode) selectionPath.getLastPathComponent();
return (File) node.getUserObject();
}
public void treeWillCollapse(TreeExpansionEvent e) {
((DefaultMutableTreeNode) (e.getPath().getLastPathComponent())).removeAllChildren();
((DefaultMutableTreeNode) (e.getPath().getLastPathComponent())).add(new DefaultMutableTreeNode(null));
}
public void treeWillExpand(TreeExpansionEvent e) {
expandPath((DefaultMutableTreeNode) (e.getPath().getLastPathComponent()));
}
}
Java:
package tests.swing;
import java.awt.Component;
import java.io.File;
import javax.swing.JTree;
import javax.swing.filechooser.FileSystemView;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeCellRenderer;
class FileTreeRenderer extends DefaultTreeCellRenderer {
private FileSystemView fsv = FileSystemView.getFileSystemView();
public Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel, boolean expanded,
boolean leaf, int row, boolean hasFocus) {
super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row, hasFocus);
Object user = ((DefaultMutableTreeNode) value).getUserObject();
if(user instanceof File) {
File f = (File) user;
String name = f.getName();
setIcon(fsv.getSystemIcon(f));
setText(fsv.getSystemDisplayName(f));
}
return this;
}
}
Java:
package tests.swing;
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.io.File;
import javax.swing.AbstractAction;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.UIManager;
import javax.swing.border.Border;
public class FileTreeTest {
/**
* @param args
*/
public static void main(String[] args) throws Exception {
UIManager.setLookAndFeel( UIManager.getSystemLookAndFeelClassName() );
final JFrame f = new JFrame("Datei auswählen");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final FileTree chooser = new FileTree();
chooser.setFileFilter(FileTree.DIRECTORY_FILTER);
JScrollPane scrp = new JScrollPane(chooser);
Border empty = BorderFactory.createEmptyBorder(5, 5, 2, 5);
scrp.setBorder(BorderFactory.createCompoundBorder(empty, scrp.getBorder()));
JPanel bottom = new JPanel(new FlowLayout(FlowLayout.RIGHT));
bottom.add(new JButton(new AbstractAction("OK") {
public void actionPerformed(ActionEvent e) {
File file = chooser.getSelectedFile();
String s = "'" + file+ "'";
if(file == null)
s = "nix";
JOptionPane.showMessageDialog(f, "Es wurde "+s+" selektiert.");
f.dispose();
}
}));
f.add(scrp);
f.add(bottom, BorderLayout.SOUTH);
f.setSize(300, 400);
f.setLocationRelativeTo(null);
f.setVisible(true);
}
}