Java JTree:如何检查当前节点是否为文件
我使用下面的代码来填充一个工作正常的JTreeJava JTree:如何检查当前节点是否为文件,java,swing,file,directory,jtree,Java,Swing,File,Directory,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(childr
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
}
}
要获取最后一个选定的组件,但我真正要做的是检查选定的组件是否属于
文件类型
,如果是,则返回该文件的路径。。。有人知道怎么做吗?您正在使用的DefaultMutableTreeNode
包含一个“userObject”,在您的情况下,它是表示名称的字符串
:
DefaultMutableTreeNode node = new DefaultMutableTreeNode(children[i].getName());
如果要将文件
存储在节点中(或文件
的任何唯一标识符),则可以使用
如果选择这种方法,可能需要更改树上的渲染器。通过扩展DefaultTreeCellRenderer
并覆盖gettreecellrendercomponent
,可以实现具有等效行为的呈现器,如下所示
@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)您正在使用的
DefaultMutableTreeNode
包含一个“userObject”,在您的例子中,它是表示名称的字符串
:
DefaultMutableTreeNode node = new DefaultMutableTreeNode(children[i].getName());
如果要将文件
存储在节点中(或文件
的任何唯一标识符),则可以使用
如果选择这种方法,可能需要更改树上的渲染器。通过扩展DefaultTreeCellRenderer
并覆盖gettreecellrendercomponent
,可以实现具有等效行为的呈现器,如下所示
@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)这里有一个小片段,看起来和你的差不多(如果你能提供一个。基本上,我将与
DefaultMutableTreeNode
关联的用户对象从字符串更改为文件。我还添加了一个自定义的TreeCellRenderer
,以仅显示文件的名称(而不是其绝对路径),以及一个TreeSelectionListener
,将当前选定的文件
对象输出到控制台
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();
}
});
}
}
您可能还想看看这一点。这里有一个小片段,看起来或多或少像您的片段(如果您能够提供。基本上,我将与DefaultMutableTreeNode
关联的用户对象从字符串更改为文件。我还添加了一个自定义的TreeCellRenderer
,以仅显示文件的名称(而不是其绝对路径),以及一个TreeSelectionListener
,将当前选定的文件
对象输出到控制台
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();
}
});
}
}
您可能还想看看这个。我用的是这样的东西:
private boolean isFileSelected()
{
TreePath treePath = tree.getSelectionPath();
Object lastPathComponent = treePath.getLastPathComponent();
DefaultMutableTreeNode node = (DefaultMutableTreeNode) lastPathComponent;
return node.getUserObject() instanceof MyNodeObject;
}
MyNodeObject
应与文件夹数据类型不同,以便您可以识别节点是否为文件。我使用的是类似以下内容:
private boolean isFileSelected()
{
TreePath treePath = tree.getSelectionPath();
Object lastPathComponent = treePath.getLastPathComponent();
DefaultMutableTreeNode node = (DefaultMutableTreeNode) lastPathComponent;
return node.getUserObject() instanceof MyNodeObject;
}
MyNodeObject
应与文件夹数据类型不同,以便您可以识别该节点是否为文件。+1(两者)抱歉(愚蠢的提示)我错过了该集合。sort()表示伟大的代码+1(两者)抱歉(愚蠢的提示)我错过了该集合。sort()表示伟大的代码