java swing JTree 实现资源管理器 UIManager.setLookAndFeel 更改外观 2009-04-03 09:09
转自http://www.java-cn.com/bbs-jsp/show.jsp?forum=advanced&id=6589
import javax.swing.*;import javax.swing.event.*;import javax.swing.tree.*;import java.awt.*;import java.awt.event.*;import java.io.File;import java.util.EventObject;import java.util.*;
/*** 用JTree实现资源管理器* Description: File Explorer <BR>* Copyright: Copyright (c) 2001<BR>* Email to <a href=mailto:SunKingEMail@163.net>Sunking</a><BR>* * @author Sunking* @version 1.0*/public class explore extends JFrame implements TreeExpansionListener, TreeSelectionListener, ActionListener {/*** */private static final long serialVersionUID = 1L;final JTree tree = new JTree(createTreeModel());final JPanel pSub = new JPanel(new GridLayout(100, 3));final JSplitPane split;final JPanel statusbar = new JPanel(new BorderLayout());final JLabel lbStatus = new JLabel(" ");
public explore() { Dimension dimension = getToolkit().getScreenSize(); int i = (dimension.width - 640) / 2; int j = (dimension.height - 480) / 2; setBounds(i, j, 640, 480); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent windowevent) { System.exit(0); } });
split = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT, new JScrollPane( tree), new JScrollPane(pSub)); split.setLastDividerLocation(200); split.setDividerLocation(200); getContentPane().add(split); pSub.setBackground(Color.white); tree.addTreeExpansionListener(this); tree.addTreeSelectionListener(this); try { UIManager .setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel"); SwingUtilities.updateComponentTreeUI(this); //注意 } catch (Exception ex) { } getContentPane().add(statusbar, BorderLayout.SOUTH); statusbar.add(lbStatus, BorderLayout.WEST);}
public void treeCollapsed(TreeExpansionEvent e) {}
public void treeExpanded(TreeExpansionEvent e) { if (tree.getLastSelectedPathComponent() == null) return; if (tree.getLastSelectedPathComponent().toString().trim().equals( "Local")) return; TreePath path = e.getPath(); FileNode node = (FileNode) path.getLastPathComponent(); if (!node.isExplored()) { DefaultTreeModel model = (DefaultTreeModel) tree.getModel(); node.explore(); model.nodeStructureChanged(node); }}
public void valueChanged(TreeSelectionEvent e) { try { String s = ""; if (tree.getLastSelectedPathComponent() == null) return; pSub.removeAll(); if (tree.getLastSelectedPathComponent().toString().trim().equals( "Local")) { File roots[] = File.listRoots(); for (int i = 1; i < roots.length; i++) { String DiskName = roots[i].toString(); DiskName = DiskName.substring(0, DiskName.indexOf(":") + 1); addButton(DiskName, ""); } } else { Object[] path = e.getPath().getPath(); String ss = ""; for (int i = 1; i < path.length; i++) ss += File.separator + path[i].toString(); File f = new File(ss.substring(1)); lbStatus.setText(f.toString()); String[] list = f.list(); Vector vFile = new Vector(), vDir = new Vector(); for (int i = 0; i < list.length; i++) { if ((new File(ss + File.separator + list[i])).isDirectory()) vDir.addElement(list[i]); else vFile.addElement(list[i]); } sortElements(vFile); sortElements(vDir); for (int i = 0; i < vDir.size(); i++) addButton((String) (vDir.elementAt(i)), ss); for (int i = 0; i < vFile.size(); i++) addButton((String) (vFile.elementAt(i)), ss); } pSub.doLayout(); pSub.repaint(); } catch (Exception ee) { }}
public void sortElements(Vector v) { for (int i = 0; i < v.size(); i++) { int k = i; for (int j = i + 1; j < v.size(); j++) if (((String) (v.elementAt(j))).toLowerCase().compareTo( ((String) (v.elementAt(k))).toLowerCase()) < 0) k = j; if (k != i) swap(k, i, v); }}
private void swap(int loc1, int loc2, Vector v) { Object tmp = v.elementAt(loc1); v.setElementAt(v.elementAt(loc2), loc1); v.setElementAt(tmp, loc2);}
private void addButton(String fileName, String filePath) { JButton btt = new JButton(fileName); btt.setBorder(null); btt.setHorizontalAlignment(SwingConstants.LEFT); btt.setBackground(Color.white); if ((new File(filePath + File.separator + fileName)).isDirectory()) btt.setIcon(UIManager.getIcon("Tree.closedIcon")); else btt.setIcon(UIManager.getIcon("Tree.leafIcon")); pSub.add(btt); btt.addActionListener(this);}
public void actionPerformed(ActionEvent e) { try { TreePath p = tree.getLeadSelectionPath(); String text = ((JButton) (e.getSource())).getText(); Object[] path = p.getPath(); String ss = ""; for (int i = 1; i < path.length; i++) ss += File.separator + path[i].toString(); ss = ss.substring(1); File f = new File(ss + File.separator + text); lbStatus.setText(f.toString()); if (f.isDirectory()) { int index = tree.getRowForPath(p); tree.expandRow(index); while (!(tree.getLastSelectedPathComponent().toString().trim() .equals(text))) tree.setSelectionRow(index++); tree.expandRow(index - 1); } else { String postfix = text.toUpperCase(); if (postfix.indexOf(".TXT") != -1 || postfix.indexOf(".JAVA") != -1 || postfix.indexOf(".HTM") != -1 || postfix.indexOf(".LOG") != -1) Runtime.getRuntime().exec( "NotePad.exe " + ss + File.separator + text); } } catch (Exception ee) { }}
private DefaultMutableTreeNode createTreeModel() { DefaultMutableTreeNode rootNode = new DefaultMutableTreeNode("Local"); File[] rootPath = File.listRoots(); for (int i = 1; i < rootPath.length; i++) { FileNode Node = new FileNode(rootPath[i]); Node.explore(); rootNode.add(Node); } return rootNode;}
public static void main(String args[]) { new explore().setVisible(true);}
class FileNode extends javax.swing.tree.DefaultMutableTreeNode { private boolean explored = false;
public FileNode(File file) { setUserObject(file); }
public boolean getAllowsChildren() { return isDirectory(); }
public boolean isLeaf() { return !isDirectory(); }
public File getFile() { return (File) getUserObject(); }
public boolean isExplored() { return explored; }
public boolean isDirectory() { return getFile().isDirectory(); }
public String toString() { File file = (File) getUserObject(); String filename = file.toString(); int index = filename.lastIndexOf(File.separator); return (index != -1 && index != filename.length() - 1) ? filename .substring(index + 1) : filename; }
public void explore() { if (!isDirectory()) return; if (!isExplored()) { File file = getFile();
// Java的Swing库缺省使用Metal LAF,但所有版本的Swing都带有包含了Motif LAF的ui.jar。// 另外,Windows版本的Swing包含Windows LAF,OS X版本的则包含Mac LAF。
// UIManager.setLookAndFeel("javax.swing.plaf.motif.MotifLookAndFeel"); //UIManager.setLookAndFeel("javax.swing.plaf.windows.WindowsLookAndFeel"); //UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel"); //UIManager.setLookAndFeel("com.apple.mrj.swing.MacLookAndFeel"); //UIManager.getSystemLookAndFeelClassName() //所用平台的外观
try { UIManager .setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel"); SwingUtilities.updateComponentTreeUI(this); //注意 } catch (Exception ex) { }
UIManager.setLookAndFeel("javax.swing.plaf.motif.MotifLookAndFeel");
UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");