java swing JTree 实现资源管理器 UIManager.setLookAndFeel 更改外观

本文介绍如何使用 Java Swing 中的 JTree 控件来创建一个简易资源管理器应用程序。该程序可以显示计算机上的文件夹结构,并允许用户浏览文件夹内容。通过监听树形结构的展开事件,程序能够动态加载子文件夹。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值