<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

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

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

    代碼清單:

    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: 系統目錄樹,動態(tài)生成,解決載入慢的問題 </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 蔣家狂潮 閱讀(1539) 評論(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:/");
    }  回復  更多評論
      

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


    網站導航:
     
    主站蜘蛛池模板: 亚洲精品国产字幕久久不卡| 国产日韩久久免费影院| 久久精品国产精品亚洲精品| 午夜一区二区免费视频| **实干一级毛片aa免费| 国产一级片免费看| 国产免费一区二区三区免费视频| 亚洲av永久无码精品网址| 亚洲福利视频网址| 亚洲国产精品无码久久久不卡| 亚洲成av人在片观看| 在线jlzzjlzz免费播放| 免费看污成人午夜网站| 999久久久免费精品播放| 久久国产美女免费观看精品| 真人无码作爱免费视频| 亚洲av永久无码精品秋霞电影秋 | 亚洲日韩看片无码电影| 亚洲免费一级视频| 亚洲综合一区二区精品久久| 亚洲va在线va天堂va不卡下载| 77777亚洲午夜久久多人| 国产精品亚洲综合专区片高清久久久 | 国产成人精品123区免费视频| 无码日韩精品一区二区免费| 免费看片在线观看| 精品国产污污免费网站aⅴ| 精品无码国产污污污免费网站| 日本在线免费播放| 免费av一区二区三区| 久久免费视频99| 99久久综合精品免费| 人妻丰满熟妇无码区免费| 三年片在线观看免费观看大全动漫 | 国产99视频精品免费观看7| 国产精品爱啪在线线免费观看| 在线看免费观看AV深夜影院| 黄页网站免费在线观看| 国产福利在线观看免费第一福利| 国产美女在线精品免费观看| 成人免费视频小说|