1

次のコードを使用して、完全に機能している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であるかどうかを確認し、そうである場合はそのファイルのパスを返します...これを行う方法を知っている人はいますか?

4

3 に答える 3

2

これは、多かれ少なかれあなたのものに似ている小さなスニペットです(SSCCEを提供できればもっと簡単だったでしょう)。基本的に、 に関連付けられているユーザー オブジェクトを から に変更しDefaultMutableTreeNodeましStringFile。また、 (絶対パスではなく)TreeCellRendererの名前のみを表示するようにカスタマイズした と、現在選択されているオブジェクトをコンソールに出力する を追加しました。FileTreeSelectionListenerFile

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も参照してください。

于 2012-07-10T18:28:41.110 に答える
2

あなたDefaultMutableTreeNodeが使用しているには、あなたの場合は名前を表す「userObject」が含まれていますString

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

Fileをノード (または の一意の識別子)に保存する場合は、利用可能な getterFileを使用して取得できます。

このアプローチを選択した場合、おそらくツリーのレンダラーを変更する必要があります。同等の動作を持つレンダラーは、次のように を拡張し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 を起動するのが面倒です)

于 2012-07-10T18:13:08.337 に答える