【问题标题】:Java Swing: how do I define how a JTree displays the "user object"?Java Swing:如何定义 JTree 如何显示“用户对象”?
【发布时间】:2011-02-04 05:32:30
【问题描述】:

使用JTree 时,可以设置DefaultMutableTreeNode 的“用户对象”。这可以是任何类型的,但要显示它,使用它的toString() 值。这不是我需要的。

如何更改用户对象的显示方式?

注意:我的用户对象 必须String 不同,以便能够维护树和用户对象之间的映射。

【问题讨论】:

    标签: java swing jtree treemodel user-object


    【解决方案1】:

    我不明白你有什么问题。

    DefaultMutableTreeNode 将在用户对象上使用toString 方法,因为它是有意义的。 JTree 需要字符串来绘制对象,因此向您的对象询问它的​​字符串表示是可以的。

    如果你真的需要避免在你的对象上调用toString,那么无论如何你都需要一种方法来提供它的字符串表示,但你必须编写自己的MutableTreeNode

    class MyTreeNode implements MutableTreeNode
    {
      UserObject yourObject;
    
      MyTreeNode(UserObject yourObject)
      {
        this.yourObject = yourObject;
      }
    
      // implement all needed methods to handle children and so on
    
      public String toString()
      {
        // then you can avoid using toString
        return yourObject.sringRapresentation();
      }
    }
    

    但我真的不明白这样做的意义..此外,您可以尝试通过覆盖 toString 方法来扩展 DefaultMutableTreeNode,但您需要对您的对象的额外引用或一些 向下转换 将需要。

    如果您确实需要与字符串不同的可视化,则必须编写自己的渲染器来实现TableCellRenderer

    【讨论】:

    • 这正是我的问题:我不知道在这种情况下覆盖 DefaultMutableTreetoString() 与覆盖用户对象的 toString() 相同(顺便说一下final 并且来自外部 API,所以我做不到)。
    • 如果我有一个包含 Activity 对象的 JTree,其中一个 Activity 有一个 Title 和一个 Time 字段,我可能会在表格中使用这个对象,在单独的列中我显示标题和时间,并在 Jtree 中使用它我想显示标题-时间..但是,如果我只有 toString() 方法可以覆盖,我不能同时满足...
    【解决方案2】:

    在您的用户对象上覆盖 toString() 或提供 TreeCellRendererbasic example

    【讨论】:

    • 我会让渲染器尽可能的薄。
    【解决方案3】:

    如果您只关心为用户对象显示的文本并且不想打扰 TreeCellRender,则另一种选择:扩展 JTree 并使用您自己的代码覆盖 convertValueToText,从而为该对象创建描述性字符串。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-28
      • 1970-01-01
      • 1970-01-01
      • 2016-10-09
      • 2019-09-23
      • 2011-02-18
      • 1970-01-01
      相关资源
      最近更新 更多