隨筆-50  評論-55  文章-8  trackbacks-0

          一般情況下,構建一個 SWING 樹,都是先要構建好存放數據的模型 (TreeModel), 在一般情況下,實現起來都沒有問題,但當數據量非常大的時候,一次性構建好 TreeModel ,將會花費很多時間,界面處于灰掉的狀態(當然可以另開其他線程,可以操作其他界面),這個給用戶的感覺非常差。解決這個問題的關鍵在于,樹模型的數據。我們都知道,系統文件是一層一層很有層次性,這樣我們就可以以一個文件(不管是文件還是文件夾)為樹節點,當初次加載樹的時候,點擊樹節點,先判斷其有沒有子節點,若無,就去讀去該節點的保存的文件信息,若為文件夾,就去取其文件夾下的所有文件,構造出樹節點,加到樹中。第二次點擊的時候,就不會去讀磁盤文件系統了。

          代碼清單:

          import javax.swing.tree.DefaultMutableTreeNode;

          import javax.swing.tree.DefaultTreeModel;

          import java.io.*;

          import java.awt.*;

          import javax.swing.*;

          import javax.swing.tree.TreeCellRenderer;

          import java.awt.event.MouseAdapter;

          import java.awt.event.MouseEvent;

          import javax.swing.tree.TreePath;

          /**

          ?* <p>Title: JDHSystemFileTree</p>

          ?* <p>Description: 系統目錄樹,動態生成,解決載入慢的問題 </p>

          ?* <p>Copyright: Copyright (c) 2007</p>

          * @author 蔣家狂潮

          ?* @version 1.0

          ?*/

          public class SystemFileTree {

          ??? private DefaultTreeModel model;

          ??? private JTree tree;

          ??? public SystemFileTree () {

          ??????? JFrame f=new JFrame();

          ??????? f.getContentPane().setLayout(new BorderLayout());

          ??????? tree=new JTree();

          ?????? ?tree.addMouseListener(new MouseAdapter(){

          ??????????? public void mousePressed(MouseEvent e){

          ??????????????? node_mouseAction(e);

          ??????????? }

          ??????? });

          ??????? JScrollPane scroll=new JScrollPane(tree);

          ??????? f.getContentPane().add(scroll,BorderLayout.CENTER);

          ?

          ??????? f.setLocation(250,250);

          ??????? f.setSize(new Dimension(300,500));

          ??????? f.setVisible(true);

          ??? }

          ??? private void node_mouseAction(MouseEvent e){

          ??????? int row = tree.getRowForLocation(e.getX(), e.getY());

          ??????? PathNode pathNode =null;

          ??????? if(row != -1){

          ??????? TreePath path = tree.getPathForRow(row);

          ??????? pathNode = (PathNode)path.getLastPathComponent();

          ?

          ??????? if(pathNode.isFolder()&&pathNode.getChildCount()==0){

          ??????????? builderNode(pathNode);

          ??????????? tree.expandPath(path);

          ??????? }

          ??????? }

          ?

          ??? }

          ??? private PathNode builderNode(PathNode pathNode){

          ??????? String filePath= pathNode.getValue().toString();

          ??????? File file=new File(filePath);

          ??????? File[] files=file.listFiles();

          ?????? for(int i=0;i<files.length;i++){

          ?????????? PathNode node=new PathNode(files[i].getName(), files[i].getAbsolutePath(),files[i].isDirectory());

          ?????????? pathNode.add(node);

          ?????? }

          ??????? return pathNode;

          ??? }

          ??? private void initData(String? rootPath){

          ?

          ??????? File f=new File(rootPath);

          ?

          ??????? PathNode root=new PathNode(f.getName(), rootPath,f.isDirectory());

          ?

          ??????? File[] files=f.listFiles();

          ??????? for(int i=0;i<files.length;i++){

          ??????????? PathNode node=new PathNode(files[i].getName(), files[i].getAbsolutePath(),files[i].isDirectory());

          ??????????? root.add(node);

          ??????? }

          ?

          ?

          ??????? model=new DefaultTreeModel(root);

          ??????? tree.setModel(model);

          ??????? FileTreeRenderer renderer=new FileTreeRenderer();

          ??????? tree.setCellRenderer(renderer);

          ??????? tree.repaint();

          }

          ?

          ??? class FileTreeRenderer implements TreeCellRenderer{

          ??????? private Icon folder_open=new ImageIcon("icons/folder_open.jpg");

          ??????? private Icon folder_close=new ImageIcon("icons/folder_close.jpg");

          ??????? private Icon file=new ImageIcon("icons/file.gif");

          ??????? public Component getTreeCellRendererComponent(JTree tree, Object value,

          ??????????????? boolean selected, boolean expanded, boolean leaf, int row,

          ??????????????? boolean hasFocus) {

          ??????????? JLabel label = null;

          ?????????? ?if (value != null) {

          ??????????????? System.out.println(value.getClass().toString());

          ??????????????? if(value instanceof PathNode){

          ?

          ??????????????????? PathNode pathNode = (PathNode) value;

          ??????????????????? if (pathNode.isFolder()) {

          ??????????????? ????????if (expanded) {

          ??????????????????????????? label = new JLabel(pathNode.getUserObject().

          ?????????????????????????????????????????????? toString(),

          ?????????????????????????????????????????????? folder_open, JLabel.RIGHT);

          ??????????????????????? } else if(!expanded||leaf) {

          ??????????????????????????? label = new JLabel(pathNode.getUserObject().

          ?????????????????????????????????????????????? toString(),

          ?????????????????????????????????????????????? folder_close, JLabel.RIGHT);

          ??????????????????? ????}

          ??????????????????? } else {

          ??????????????????????? label = new JLabel(pathNode.getUserObject().toString(),

          ?????????????????????????????????????????? file, JLabel.RIGHT);

          ??????????????????? }

          ??????????????????? return label;

          ??????????????? }

          ?? ?????????}

          ??????????? return label;

          ??????? }

          }

          ?

          ??? class PathNode extends DefaultMutableTreeNode{

          ??????? Object value;

          ??????? boolean isFolder;

          ?????? public PathNode(String name,Object value,boolean isFolder){

          ?????????? super(name);

          ?????????? this.value=value;

          ?????????? this.isFolder=isFolder;

          ??????? }

          ??????? public Object getValue(){

          ????????? return value;

          ??????? }

          ??????? public boolean isFolder(){

          ??????????? return isFolder;

          ??????? }

          ??? }

          ??? public static void main(String args[]){

          ?? ?????JDHSystemFileTree tree=new JDHSystemFileTree();

          ???????? // 給個路徑作演示

          ??????? tree.initData("D:/");

          ??? }

          }

          ?

          當然可以進一步實現界面的易用性,就是在初始點擊之后,加載完之前,讓鼠標變成等待的形狀。
          ???????????????????????

          posted on 2007-10-30 16:22 蔣家狂潮 閱讀(1543) 評論(1)  編輯  收藏 所屬分類: Swing

          評論:
          # re: SWING展示系統文件樹 2008-07-24 08:43 | grid
          上面的源代碼的最后的MAIN函數錯了,正確應該如下:
          public static void main(String args[]) {
          //JDHSystemFileTree tree = new JDHSystemFileTree();
          SystemFileTree tree = new SystemFileTree();
          // 給個路徑作演示
          tree.initData("D:/");
          }  回復  更多評論
            

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 衡东县| 孟州市| 临夏市| 阿瓦提县| 嘉黎县| 石城县| 平乡县| 安岳县| 正安县| 沧州市| 百色市| 天镇县| 鹤峰县| 恭城| 常山县| 崇左市| 洱源县| 丹阳市| 大安市| 溧水县| 五莲县| 莱州市| 张家港市| 常宁市| 武城县| 信阳市| 伊金霍洛旗| 金堂县| 噶尔县| 平远县| 珲春市| 密云县| 盐源县| 开鲁县| 麟游县| 阜平县| 石台县| 扎囊县| 枣强县| 富裕县| 安化县|