【问题标题】:Creating TreeTables in Swing在 Swing 中创建树表
【发布时间】:2015-07-30 21:30:54
【问题描述】:

使用本手册 (http://www.comp.nus.edu.sg/~cs3283/ftp/Java/swingConnect/tech_topics/tables-trees/tables-trees.html) 我正在尝试为我的项目的 Swing 用户界面创建树表。

在我的表类的构造函数中,我重新定义了这样的渲染:

public class JTreeTable extends JTable {
    public JTreeTable(ITreeTableModel treeTableModel) {
        super();
        ...
        setDefaultRenderer(ITreeTableModel.class, tree); 
        ...
    }

}

treeTableModel 是我的实现

interface ITreeTableModel extends TreeModel

在结果表中看起来接近我想要的,但我有几个问题:

  1. 我的代码中的字段 (ID) 定义为对象,但实际上它代表数字(1、2、3 等)。如何更改字段 ID 的表示?

  2. 我的表中的节点不展开。 但是

    public int getChildCount(Object parent_object_id)

返回数字 > 0

附言我知道可能没有足够的信息来直接回答,但我至少需要一个可以继续调查的方向。

【问题讨论】:

  • A JTree 将使用节点的toString 方法来生成输出。您可以更改toString 方法返回的内容或使用TreeCellRenderer(最好)
  • @MadProgrammer 谢谢你的建议。它对我有用(JTree 将使用节点的 toString 方法生成输出)。第二种方法有点复杂:-)
  • 不要重新发明轮子,也不要费心(不重写BasicsTreeXxx,两个Renderer,两个模型都不容易,XxxCellEditor太难了,没有优秀的知识)1.买Jide,2.SwingX有很好的解决方法
  • @mKorbel 谢谢你的建议。我已经下载了 SwingX 演示。它看起来不错,并且包含 TreeTable 类
  • 也可以考虑Outline

标签: java swing jtreetable


【解决方案1】:

关于你的第一个问题,你应该实现一个 TreeCellRenderer。 猜测你会做类似的事情:

//and override also all the other functions of TreeCellRenderer
public Component getTreeCellRendererComponent(JTree tree, Object value,
      boolean selected, boolean expanded, boolean leaf, int row,
      boolean hasFocus) {
    Component returnValue = null;
    if ((value != null) && (value instanceof DefaultMutableTreeNode)) {
      Object userObject = ((DefaultMutableTreeNode) value)
          .getUserObject();
      if (userObject instanceof YourClass) {
        YourClass yourElement = (YourClass) userObject;
        if(col==0) titleLabel.setText(yourElement.getID());
        if(col==1) titleLabel.setText(yourElement.getName());
        if(col==2) titleLabel.setText(yourElement.getParentID());
        if (selected) {
          renderer.setBackground(backgroundSelectionColor);
        } else {
          renderer.setBackground(backgroundNonSelectionColor);
        }
        renderer.setEnabled(tree.isEnabled());
        returnValue = renderer;
      }
    }
    if (returnValue == null) {
      returnValue = defaultRenderer.getTreeCellRendererComponent(tree,
          value, selected, expanded, leaf, row, hasFocus);
    }
    return returnValue;
  }
}

目前发生在您身上的是您的 Cell Renderer 正在返回 Object 实例元素 ID(例如 DictionaryItem@11abb71),而不是获取对象并调用 getID() 函数。

您可以在TreeCellRenderer example. 上找到更多示例和信息

与您的第二个问题有关,请参阅TreeModel example 上的示例。也许您也可以尝试按代码扩展行。 如果“+”图标变为“-”,则可能意味着 getChildCount 运行良好,但它不起作用的是 getChild(int row) 将返回 null 或无效的树行元素。

【讨论】:

    猜你喜欢
    • 2016-08-08
    • 2012-01-08
    • 2011-10-30
    • 2016-08-28
    • 1970-01-01
    • 1970-01-01
    • 2011-12-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多