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)