【问题标题】:Java Swing: Expanding TreeNodeJava Swing:扩展 TreeNode
【发布时间】:2010-04-12 13:11:14
【问题描述】:

我正在定制一个闭源客户端应用程序。它在 UI 中有一个树,并且只公开了一个获取所选节点的方法。它返回 TreeNode 的子类。并且没有办法获得对父树的引用。现在我想将选定的节点扩展到它的叶子。

有什么方法可以从 DefaultMutableTreeNode 获取对 JTree 组件的引用?我打算使用 JTree.expandPath() 但我只有对树节点的引用。

我是 Swing 新手,欢迎提出任何实现这一目标的建议。

【问题讨论】:

    标签: java swing


    【解决方案1】:

    其实只有JTree知道展开状态,TreeNodes中没有这样的信息。 TreeNodes 在"model" 一侧,并且在 JTree 上没有指针(至少不是默认的,您当然可以使用引用创建自己的,但它有点打破了模式)。

    您应该重新考虑您想要进行此扩展的地方,以便您可以访问 JTree(提供有关您的上下文的更多详细信息,以了解更多您想要做什么以及在什么情况下)。

    【讨论】:

    • 我正在定制一个闭源客户端应用程序。它在 UI 中有一个树,并且只公开了一个获取所选节点的方法。它返回 TreeNode 的子类。并且没有办法获得对父树的引用。现在我想将选定的节点扩展到它的叶子。
    • @sarav - 在这种情况下,恐怕你不走运。如果除了 TreeNode 之外没有任何其他访问权限,则无法控制 JTree 的展开状态。如果您可以访问顶部窗口/组件(或同一窗口中的任何组件),并且确定它的结构是静态的,则可能有一种(非常)肮脏的方式来自那里的 JTree。
    • @sarav - (速记,考虑用这些新的细节编辑你的问题,让大家更清楚地看到整个情况)
    • 感谢您的回复。是的,我在这里不走运。寻找其他解决方法。
    【解决方案2】:

    查看DefaultMutableTreeNode 的源代码,我看不出有什么好的方法,但您可以尝试以下方法之一:

    • 扩展 DefaultMutableTreeNode 并存储对您的树的引用
    • 默认节点有一个“用户对象”的概念。您可以将树的引用设置为此对象。它完全不安全,但可能会起作用。 编辑: 实际上,仔细观察用户对象的使用方式(作为树路径的文本表示和toString()),以这种方式设置用户对象将破坏 API 的预期用途。所以:讨厌,但可能有用。

    【讨论】:

      【解决方案3】:

      树节点是树模型中的一个元素。因此,它没有对作为其视图的 Tree 的任何引用。

      知道你在哪个对象中可能很有趣:因为你想对鼠标事件做出反应,我猜你可以访问视图层(至少通过取回发起 MouseEvent 的组件,这应该是J树)。如果是这样,您可以获取选定的行并调用expandPath。从 DefaultMutableTreeNode 构建 TreePath 作为练习:-)

      EDIT 从下面的 cmets 中,让我澄清一下我的答案。 您必须使用通过在 DefaultMutableTreeNode 上调用 getPath 生成的 TreePath 调用 expandPath

      【讨论】:

      • 不过,我在他的问题中没有看到对鼠标事件的引用。
      • 如果它恰好是对用户点击的响应,event.getSource() 可能是最好的选择。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-27
      • 1970-01-01
      • 1970-01-01
      • 2011-02-12
      相关资源
      最近更新 更多