[英]JTree: how to check if current node is a file
我使用以下代碼填充一個完美的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
類型,如果是,返回該文件的路徑...有誰知道如何做到這一點?
您正在使用的DefaultMutableTreeNode
包含一個'userObject',在您的情況下是表示名稱的String
:
DefaultMutableTreeNode node = new DefaultMutableTreeNode(children[i].getName());
如果你想存儲File
(一個或唯一標識符的節點File
),你可以使用檢索它提供吸氣 。
如果您選擇此方法,則可能必須更改樹上的渲染器。 可以通過擴展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)
這是一個看起來或多或少與你相似的小片段(如果你能提供一個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();
}
});
}
}
您可能還想查看此文件瀏覽器GUI 。
我正在使用這樣的東西:
private boolean isFileSelected()
{
TreePath treePath = tree.getSelectionPath();
Object lastPathComponent = treePath.getLastPathComponent();
DefaultMutableTreeNode node = (DefaultMutableTreeNode) lastPathComponent;
return node.getUserObject() instanceof MyNodeObject;
}
MyNodeObject
應該與文件夾數據類型不同,因此您可以識別節點是否是文件。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.