【问题标题】:JTree how to set a leaf node as expandableJTree如何将叶节点设置为可扩展
【发布时间】:2015-07-16 10:17:19
【问题描述】:

我有点不知所措,因为我似乎找不到任何东西。

基本上,我使用JTree 来显示服务器和其中的结构。我不想加载整个结构,因为查询需要很长时间,所以我想在用户展开节点时加载它。

结构看起来像这样(我总是知道根服务器节点)

服务器 -表 -列

我想先添加“服务器”,然后当用户展开它时我想添加“表”,然后当用户展开时我想添加“列”。

我按照教程设置整个 TreeWillExpandListener,这是我的代码:

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()”。我怎样才能使它具有扩展控件?

另外,在这里使用什么术语是正确的,因为这似乎是一个非常典型的事情,但我在 Google 上找不到任何东西。

【问题讨论】:

  • 查看File Browser GUI 的工作示例。
  • 您也许可以使用treeModel.setAsksAllowsChildren(true);

标签: java swing user-interface jtree


【解决方案1】:

根据aterai的回答:

treeModel.setAsksAllowsChildren(true)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-23
    • 2012-11-27
    • 2010-10-05
    • 1970-01-01
    • 1970-01-01
    • 2017-12-31
    • 1970-01-01
    • 2011-08-20
    相关资源
    最近更新 更多