【问题标题】:JTree: how to check if current node is a fileJTree:如何检查当前节点是否为文件
【发布时间】:2012-07-10 06:22:08
【问题描述】:

我正在使用以下代码来填充一个运行良好的 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 类型,如果是,则返回该文件的路径...有人知道该怎么做吗?

【问题讨论】:

    标签: java swing file directory jtree


    【解决方案1】:

    我正在使用这样的东西:

    private boolean isFileSelected()
    {
        TreePath treePath = tree.getSelectionPath();
        Object lastPathComponent = treePath.getLastPathComponent();
        DefaultMutableTreeNode node = (DefaultMutableTreeNode) lastPathComponent;
    
        return node.getUserObject() instanceof MyNodeObject;
    }
    

    MyNodeObject 应该与文件夹数据类型不同,以便您可以识别节点是否为文件。

    【讨论】:

      【解决方案2】:

      这是一个看起来或多或少像你的小sn-p(如果你能提供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

      【讨论】:

      • +1(两者)对不起(愚蠢的提示)我想念 Colection.sort() 以获得出色的代码
      【解决方案3】:

      您使用的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)

      【讨论】:

        猜你喜欢
        • 2011-02-18
        • 2012-06-08
        • 2014-06-28
        • 2019-06-20
        • 2015-11-05
        • 2012-04-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多