JTree - Anwendung 1 - Ein DirectoryChooser

Status
Nicht offen für weitere Antworten.
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

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);
	}

}
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Oben