Java JTree如何将叶节点设置为可展开的
我有点不知所措,不知该在这里寻找什么,因为我似乎什么也找不到 基本上,我使用Java JTree如何将叶节点设置为可展开的,java,swing,user-interface,jtree,Java,Swing,User Interface,Jtree,我有点不知所措,不知该在这里寻找什么,因为我似乎什么也找不到 基本上,我使用JTree来显示服务器及其内部的结构。我不想加载整个结构,因为查询需要很长时间,所以我希望在用户扩展节点时加载它 结构类似于此(我总是知道根服务器节点) 服务器 -桌子 -纵队 我想先添加“服务器”,然后当用户展开它时,我想添加“表”,然后当用户展开时,我想添加“列” 我遵循了关于设置整个TreeWireXPandListener的教程,以下是我的代码: public class ServerViewer extends
JTree
来显示服务器及其内部的结构。我不想加载整个结构,因为查询需要很长时间,所以我希望在用户扩展节点时加载它
结构类似于此(我总是知道根服务器节点)
服务器
-桌子
-纵队
我想先添加“服务器”,然后当用户展开它时,我想添加“表”,然后当用户展开时,我想添加“列”
我遵循了关于设置整个TreeWireXPandListener的教程,以下是我的代码:
public class ServerViewer extends JScrollPane
implements TreeModelListener, TreeExpansionListener, TreeWillExpandListener {
/**
*
*/
private static final long serialVersionUID = 1L;
public ServerViewer(
final Model model) {
Validate.isTrue(model != null, "'model' must not be null.");
this.model = model;
// Create root node of tree
DefaultMutableTreeNode rootNode = new DefaultMutableTreeNode("Servers (2)");
createNodes(rootNode);
// Create tree model
DefaultTreeModel treeModel = new DefaultTreeModel(rootNode);
treeModel.addTreeModelListener(this);
// Create tree
this.browserTree = new JTree(treeModel);
//this.browserTree.setRootVisible(false);
this.browserTree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
this.browserTree.addTreeExpansionListener(this);
this.browserTree.addTreeWillExpandListener(this);
// Add components
this.getViewport().add(this.browserTree);
}
/**
* Populates the root node with the expected default nodes.
*
* @param rootNode The node to populate. Must not be null.
*/
private void createNodes(DefaultMutableTreeNode rootNode) {
Validate.isTrue(rootNode != null, "'rootNode' must not be null.");
for (ServerModel server: this.model.getServers()) {
DefaultMutableTreeNode serverNode = new DefaultMutableTreeNode(server, true);
rootNode.add(serverNode);
}
}
/**
* @return The tree which this uses as a browser. Will not be null.
*/
public JTree getBrowserTree() {
return this.browserTree;
}
@Override
public void treeNodesChanged(
TreeModelEvent arg0) {
DefaultMutableTreeNode node = (DefaultMutableTreeNode)arg0.getTreePath().getLastPathComponent();
/*
* If the event lists children, then the changed
* node is the child of the node we have already
* gotten. Otherwise, the changed node and the
* specified node are the same.
*/
try {
int index = arg0.getChildIndices()[0];
node = (DefaultMutableTreeNode)node.getChildAt(index);
}
catch (NullPointerException exc) {}
System.out.println("The user has finished editing the node.");
System.out.println("New value: " + node.getUserObject());
}
@Override
public void treeNodesInserted(
TreeModelEvent arg0) {
}
@Override
public void treeNodesRemoved(
TreeModelEvent arg0) {
}
@Override
public void treeStructureChanged(
TreeModelEvent arg0) {
}
@Override
public void treeCollapsed(TreeExpansionEvent arg0) {
}
@Override
public void treeExpanded(TreeExpansionEvent arg0) {
}
@Override
public void treeWillCollapse(
TreeExpansionEvent arg0) throws ExpandVetoException {
TreePath path = arg0.getPath();
DefaultMutableTreeNode node = (DefaultMutableTreeNode) path.getLastPathComponent();
String data = node.getUserObject().toString();
System.out.println("WillCollapse: " + data);
}
@Override
public void treeWillExpand(
TreeExpansionEvent arg0) throws ExpandVetoException {
TreePath path = arg0.getPath();
DefaultMutableTreeNode node = (DefaultMutableTreeNode) path.getLastPathComponent();
String data = node.getUserObject().toString();
System.out.println("WillExpand: " + data);
}
/**
* The model which this is viewing.
*/
private Model model;
/**
* Displays the contents of a database.
*/
private JTree browserTree;
}
我的问题是,当我将“服务器”节点放入时,它没有子节点,因此它没有扩展它的控件。这意味着从未为该节点调用“treeWillExpand()”。如何使其具有扩展控制
另外,这里应该使用什么术语,因为这似乎是一件非常典型的事情,但我在谷歌上找不到任何东西。根据aterai的回答:
treeModel.setAsksAllowsChildren(true)
有关工作示例,请参见。您可以使用
treeModel.setasksallowschilds(true)代码>