2012-07-10 63 views
1

我使用下面的代碼來填充一個JTree這是工作完美JTree的:如何檢查當前節點是一個文件

File [] children = new File(directory).listFiles(); // list all the files in the directory 
for (int i = 0; i < children.length; i++) { // loop through each 
    DefaultMutableTreeNode node = new DefaultMutableTreeNode(children[i].getName()); 
    // only display the node if it isn't a folder, and if this is a recursive call 
    if (children[i].isDirectory() && recursive) { 
     parent.add(node); // add as a child node 
     listAllFiles(children[i].getPath(), node, recursive); // call again for the subdirectory 
    } else if (!children[i].isDirectory()){ // otherwise, if it isn't a directory 
     parent.add(node); // add it as a node and do nothing else 
    } 
} 

給一個目錄的字符串,它增加了在該目錄中的所有文件JTree的,我的問題是,我無法從每個節點的文件......我知道你可以使用

jtree.getLastSelectedPathComponent() 

獲得最後選定的組件,但我真的什麼是檢查是否選擇組件的類型爲File,如果是,則返回該文件的路徑...是否有人知道如何做到這一點?

回答

2

DefaultMutableTreeNode您使用包含「userObject」,而你的情況是代表名稱String

DefaultMutableTreeNode node = new DefaultMutableTreeNode(children[i].getName()); 

如果將存儲在節點的File(或爲File任何唯一標識符)你可以使用available getter來檢索它。

如果您選擇此方法,您可能必須更改樹上的渲染器。與等效行爲的渲染器可以通過擴展DefaultTreeCellRenderer並重寫getTreeCellRendererComponent如下實現

@Override 
public Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel, boolean expanded, boolean leaf, int row, boolean hasFocus){ 
    Component result = super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row, hasFocus); 
    if (value instanceof DefaultMutableTreeNode && ((DefaultMutableTreeNode)value).getUserObject() instanceof File){ 
    ((JLabel)result).setText((File)((DefaultMutableTreeNode)value).getUserObject()).getName()); 
    } 
} 

注:上面的代碼不被測試。我希望我沒有在我的括號內犯任何錯誤,...(懶得打開我的IDE)

2

這是一個小片段,或多或少看起來像你的(如果你可以提供的話會更容易一個SSCCE)。基本上,我將與DefaultMutableTreeNode關聯的用戶對象從String更改爲File。我還添加了一個定製的TreeCellRenderer,以僅顯示File(而不是其絕對路徑)的名稱和一個TreeSelectionListener,它向控制檯輸出當前選定的File對象。

import java.awt.Component; 
import java.io.File; 

import javax.swing.JFrame; 
import javax.swing.JScrollPane; 
import javax.swing.JTree; 
import javax.swing.SwingUtilities; 
import javax.swing.event.TreeSelectionEvent; 
import javax.swing.event.TreeSelectionListener; 
import javax.swing.tree.DefaultMutableTreeNode; 
import javax.swing.tree.DefaultTreeCellRenderer; 

public class TestTreeFile { 

    protected void initUI() { 
     JFrame frame = new JFrame(TestTreeFile.class.getSimpleName()); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     final JTree tree = new JTree(createTreeModel(new File(System.getProperty("user.dir")), true)); 
     tree.setCellRenderer(new DefaultTreeCellRenderer() { 
      @Override 
      public Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel, boolean expanded, boolean leaf, int row, 
        boolean hasFocus) { 
       super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row, hasFocus); 
       if (value instanceof DefaultMutableTreeNode) { 
        DefaultMutableTreeNode node = (DefaultMutableTreeNode) value; 
        if (node.getUserObject() instanceof File) { 
         setText(((File) node.getUserObject()).getName()); 
        } 
       } 
       return this; 
      } 
     }); 
     tree.getSelectionModel().addTreeSelectionListener(new TreeSelectionListener() { 

      @Override 
      public void valueChanged(TreeSelectionEvent e) { 
       Object object = tree.getLastSelectedPathComponent(); 
       if (object instanceof DefaultMutableTreeNode) { 
        Object userObject = ((DefaultMutableTreeNode) object).getUserObject(); 
        if (userObject instanceof File) { 
         File file = (File) userObject; 
         System.err.println("Selected file" + file.getAbsolutePath() + " Is directory? " + file.isDirectory()); 
        } 
       } 
      } 
     }); 
     JScrollPane pane = new JScrollPane(tree); 
     frame.add(pane); 
     frame.setSize(400, 600); 
     frame.setVisible(true); 
    } 

    private DefaultMutableTreeNode createTreeModel(File file, boolean recursive) { 
     DefaultMutableTreeNode node = new DefaultMutableTreeNode(file); 
     if (file.isDirectory() && recursive) { 
      File[] children = file.listFiles(); // list all the files in the directory 
      if (children != null) { 
       for (File f : children) { // loop through each 
        node.add(createTreeModel(f, recursive)); 
       } 
      } 
     } 
     return node; 
    } 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new TestTreeFile().initUI(); 
      } 
     }); 
    } 
} 

您可能還想看看這個File Browser GUI

+0

+1(both)抱歉(愚蠢的提示)我錯過了Colection.sort() – mKorbel 2012-07-10 20:19:52

0

我使用的是這樣的:

private boolean isFileSelected() 
{ 
    TreePath treePath = tree.getSelectionPath(); 
    Object lastPathComponent = treePath.getLastPathComponent(); 
    DefaultMutableTreeNode node = (DefaultMutableTreeNode) lastPathComponent; 

    return node.getUserObject() instanceof MyNodeObject; 
} 

MyNodeObject應該從文件夾中的數據類型不同,所以您可以識別該節點是一個文件或沒有。

相關問題