阻止JTree中节点扩展的节点选择

我创建了一个JTree ,其中一些节点是自定义的,以显示它们是可扩展的,尽管它们还没有任何子节点。 我已经按照这个线程来实现它。

为什么? 我想要动态加载树,所以当树扩展时,我从服务器检索更多信息并在树上显示它。

我遇到的问题是,当我展开其中一个节点时,它会被选中,这不是默认节点的默认行为(您可以在不更改树选择的情况下展开它们)。

如何解决这个问题以防止此节点在扩展时被选中?

我没有用下面的代码解决这个问题。 如果没有看到你的代码,你必须做一些我们无法猜到的事情。 尝试使用下面的代码并修改它以重现您遇到的问题。 通过这样做,你很有可能会发现你在做什么不同以及你为什么会这样做 (另见SSCCE )。

代码已从这里获取

 import java.awt.BorderLayout; import java.awt.Container; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTree; import javax.swing.SwingUtilities; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; import javax.swing.tree.DefaultMutableTreeNode; import javax.swing.tree.TreeNode; public class DynamicTree extends JFrame { public class OutlineNode extends DefaultMutableTreeNode { private boolean areChildrenDefined = false; private int outlineNum; private int numChildren; public OutlineNode(int outlineNum, int numChildren) { this.outlineNum = outlineNum; this.numChildren = numChildren; } @Override public boolean isLeaf() { return false; } @Override public int getChildCount() { if (!areChildrenDefined) { defineChildNodes(); } return super.getChildCount(); } private void defineChildNodes() { // You must set the flag before defining children if you // use "add" for the new children. Otherwise you get an infinite // recursive loop, since add results in a call to getChildCount. // However, you could use "insert" in such a case. areChildrenDefined = true; for (int i = 0; i < numChildren; i++) { add(new OutlineNode(i + 1, numChildren)); } } @Override public String toString() { TreeNode parent = getParent(); if (parent == null) { return String.valueOf(outlineNum); } else { return parent.toString() + "." + outlineNum; } } } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { @Override public void run() { new DynamicTree(5); } }); } public DynamicTree(int n) { super("Creating a Dynamic JTree"); setDefaultCloseOperation(EXIT_ON_CLOSE); try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (ClassNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (InstantiationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IllegalAccessException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (UnsupportedLookAndFeelException e) { // TODO Auto-generated catch block e.printStackTrace(); } Container content = getContentPane(); JTree tree = new JTree(new OutlineNode(1, n)); content.add(new JScrollPane(tree), BorderLayout.CENTER); setSize(300, 475); setVisible(true); } }