2012-02-13 9 views
2

スイングコンポーネントを多用していないので混乱します。 JTreeを使用してファイルシステムツリーを表示しようとしていますが、Ian Darwin's example 少し変更すると、隠しファイルは表示されません。ファイルシステムツリーを表示するために使用されるJTreeのラベルを書式設定する

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Container; 
import java.awt.Dimension; 
import java.io.File; 
import java.util.Collections; 
import java.util.Vector; 

import javax.swing.BoxLayout; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTree; 
import javax.swing.event.TreeSelectionEvent; 
import javax.swing.event.TreeSelectionListener; 
import javax.swing.tree.DefaultMutableTreeNode; 

/** 
* Display a file system in a JTree view 
* 
* @version $Id: FileTree.java,v 1.9 2004/02/23 03:39:22 ian Exp $ 
* @author Ian Darwin 
*/ 
public class FileTree extends JPanel { 
    /** Construct a FileTree */ 
    public FileTree(File dir) { 
    setLayout(new BorderLayout()); 

    // Make a tree list with all the nodes, and make it a JTree 
    JTree tree = new JTree(addNodes(null, dir)); 

    // Add a listener 
    tree.addTreeSelectionListener(new TreeSelectionListener() { 
     public void valueChanged(TreeSelectionEvent e) { 
     DefaultMutableTreeNode node = (DefaultMutableTreeNode) e 
      .getPath().getLastPathComponent(); 
     System.out.println("You selected " + node); 
     } 
    }); 

    // Lastly, put the JTree into a JScrollPane. 
    JScrollPane scrollpane = new JScrollPane(); 
    scrollpane.getViewport().add(tree); 
    add(BorderLayout.CENTER, scrollpane); 
    } 

    /** Add nodes from under "dir" into curTop. Highly recursive. */ 
    DefaultMutableTreeNode addNodes(DefaultMutableTreeNode curTop, File dir) { 
    String curPath = dir.getPath(); 
    DefaultMutableTreeNode curDir = new DefaultMutableTreeNode(curPath); 
    if (curTop != null) { // should only be null at root 
     curTop.add(curDir); 
    } 
    Vector ol = new Vector(); 
    String[] tmp = dir.list(); 
    for (int i = 0; i < tmp.length; i++) 
     ol.addElement(tmp[i]); 
    Collections.sort(ol, String.CASE_INSENSITIVE_ORDER); 
    File f; 
    Vector files = new Vector(); 
    // Make two passes, one for Dirs and one for Files. This is #1. 
    for (int i = 0; i < ol.size(); i++) { 
     String thisObject = (String) ol.elementAt(i); 
     String newPath; 
     if (curPath.equals(".")) 
     newPath = thisObject; 
     else 
     newPath = curPath + File.separator + thisObject; 
     if ((f = new File(newPath)).isDirectory()) 
     addNodes(curDir, f); 
     else 
     if(!new File(thisObject).isHidden()) files.addElement(thisObject); 
    } 
    // Pass two: for files. 
    for (int fnum = 0; fnum < files.size(); fnum++) 
     curDir.add(new DefaultMutableTreeNode(files.elementAt(fnum))); 
    return curDir; 
    } 

    public Dimension getMinimumSize() { 
    return new Dimension(200, 400); 
    } 

    public Dimension getPreferredSize() { 
    return new Dimension(200, 400); 
    } 

    /** Main: make a Frame, add a FileTree */ 
    public static void main(String[] av) { 

    JFrame frame = new JFrame("FileTree"); 
    frame.setForeground(Color.black); 
    frame.setBackground(Color.lightGray); 
    Container cp = frame.getContentPane(); 


    cp.add(new FileTree(new File("/Users/"+System.getProperty("user.name")+"/Downloads"))); 

    frame.pack(); 
    frame.setVisible(true); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 
} 

デフォルトでは、フォルダノードはフォルダ名ではなくフルパスを表示します。 フォルダ名だけを表示することはできますか?もしそうなら、どうですか?

答えて

2

イエップ。

tree.setCellRenderer(new DefaultTreeCellRenderer(){ 

    public Component getTreeCellRendererComponent(tree, value, selected, false,      
                false,0, hasFocus){ 

     super.getTreeCellRendererComponent(tree, value, selected, false, false,0, 
              hasFocus); 

     if(value instanceof DefaultMutableTreeNode){ 

      DefaultMutableTreeNode node = (DefaultMutableTreeNode) value; 
      Object userValue = node.getUserObject(); 

      if(value instanceof File){ 
       setText(((File) value).getName(); 
      } 
     } 

     return this; 
    } 
} 
+0

これを追加するので、うーん、私は、私が何か間違ったことをやっていると思う: 'tree.setCellRenderer(新DefaultTreeCellRenderer(){ \t \t公共コンポーネントgetTreeCellRendererComponent(Object値){ \t \t \tを(値のinstanceof場合ファイル){ \t \t \t \tのsetText(((ファイル)値).getName()); \t \t \t} \t \t \tはこれを返します。 \t \t} \tは}); '選択リスナーは何も変わりません:( –

+0

賛否を追加した後、私は何か忘れてしまった - 私の編集した答え – alex

+0

は申し訳ありません参照を、私はまだ取得していないものがいくつかあります。私は...を渡す必要があるパラメータのプレースホルダです。もしそうなら、どのようにしてツリーに行き、この代わりにどの行を渡すべきですか? 'super.getTreeCellRendererComponent(tree、value、selected、false 、false、0、hasFocus); –

関連する問題