[英]Making a JTree leaf appear as an empty directory and not a file
我正在學習Java JTree的方法,但我有一個我無法弄清楚的小問題。 使用我在Oracle網站上找到的教程,我模仿了他們演示的樹形結構。 問題是,我希望文件夾“網站”是一個空文件夾,但JTree顯示它就好像它是一個文件。 如何告訴JTree“網站”實際上是一個空文件夾?
UPDATE
我開始研究一個簡單的“聯系經理”。 我想要做的基本上它使名稱看起來像文件夾(因為我想向每個人添加信息),但沒有添加東西。 即有些人可能沒有任何信息,但我仍然希望他們看起來像文件夾。
Browser類的代碼:
import java.awt.Component;
import java.io.File;
import java.util.Iterator;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
public class Browser extends JFrame implements javax.swing.tree.TreeModel {
private JTree tree;
ManagerOfContacts mngrOfContacts;
public Browser() {
//Generates the ManagerOfContacts and associated Contacts
Driver driver = new Driver();
mngrOfContacts = driver.getManagerOfContacts();
//---------------------------\\
DefaultMutableTreeNode contacts = new DefaultMutableTreeNode("Contacts");
createNodes(contacts);
tree = new JTree(contacts);
JScrollPane treeView = new JScrollPane(tree);
add(treeView);
setSize(400,400);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
}
public void createNodes(DefaultMutableTreeNode top){
DefaultMutableTreeNode contactName;
Iterator<Contact> contactItr = mngrOfContacts.getIterator();
while(contactItr.hasNext()){
contactName = new DefaultMutableTreeNode(contactItr.next());
top.add(contactName);
}
}
public static void main(String[] args) {
Browser browsr = new Browser();
}
}
這就是你如何創建自己的TreeCellRenderer
,告訴你的JTree
你想要什么。 由於您使用DefaultMutableTreeNode
作為節點的默認樹模型,因此您必須提取其用戶對象並根據該對象決定要繪制的內容。 請注意,默認渲染器只是一個擴展的JLabel
,這就是為什么你可以在其中使用setIcon(...)
, setText(...)
等。
您的葉節點用文件圖標繪制的原因可能是默認渲染器基於DefaultMutableTreeNode.getAllowsChildren()
Contact.isSomeProperty()
我如何使用Contact.isSomeProperty()
選擇圖標。
import java.awt.Component;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeCellRenderer;
public class Browser extends JFrame {
private JTree tree;
//ManagerOfContacts mngrOfContacts;
public Browser() {
//Generates the ManagerOfContacts and associated Contacts
//Driver driver = new Driver();
//mngrOfContacts = driver.getManagerOfContacts();
//---------------------------\\
DefaultMutableTreeNode contacts = new DefaultMutableTreeNode("Contacts");
createNodes(contacts);
tree = new JTree(contacts);
// use your own renderer (!)
tree.setCellRenderer(new MyTreeCellRenderer());
JScrollPane treeView = new JScrollPane(tree);
add(treeView);
setSize(400,400);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
}
public final void createNodes(DefaultMutableTreeNode top){
DefaultMutableTreeNode contactName;
// dummies
List<Contact> contacts = new ArrayList<Contact>();
contacts.add(new Contact("Me", true));
contacts.add(new Contact("You"));
Iterator<Contact> contactItr = contacts.iterator();
while(contactItr.hasNext()){
contactName = new DefaultMutableTreeNode(contactItr.next());
top.add(contactName);
}
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
Browser browsr = new Browser();
}
});
}
// dummy
private static class Contact {
private boolean someProperty;
private String name;
public Contact(String name) {
this(name, false);
}
public Contact(String name, boolean property) {
this.someProperty = property;
this.name = name;
}
public boolean isSomeProperty() {
return someProperty;
}
public String getName() {
return name;
}
@Override
public String toString() {
return name;
}
}
// this is what you want
private static class MyTreeCellRenderer extends 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);
// decide what icons you want by examining the node
if (value instanceof DefaultMutableTreeNode) {
DefaultMutableTreeNode node = (DefaultMutableTreeNode) value;
if (node.getUserObject() instanceof String) {
// your root node, since you just put a String as a user obj
setIcon(UIManager.getIcon("FileView.computerIcon"));
} else if (node.getUserObject() instanceof Contact) {
// decide based on some property of your Contact obj
Contact contact = (Contact) node.getUserObject();
if (contact.isSomeProperty()) {
setIcon(UIManager.getIcon("FileView.hardDriveIcon"));
} else {
setIcon(UIManager.getIcon("FileChooser.homeFolderIcon"));
}
}
}
return this;
}
}
}
這應該讓你開始。 您應該在JTree教程中閱讀更多相關內容。
配置treeModel以查詢其節點的askAllowsChildren屬性,以決定是否應將其視為文件夾(即使沒有子節點)
DefaultMutableTreeNode root = new DefaultMutableTreeNode("I'm the root");
// node allowsChildren - that's the default
root.add(new DefaultMutableTreeNode("folder always"));
// node doesn't accept children
root.add(new DefaultMutableTreeNode("folder never", false));
// model configured to query the node's allowsChildren property
DefaultTreeModel model = new DefaultTreeModel(root, true);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.