在 Swing 中创建树表

Ale*_*lin 5 java swing jtreetable

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

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

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

}
Run Code Online (Sandbox Code Playgroud)

其中 treeTableModel 是我的实现

interface ITreeTableModel extends TreeModel
Run Code Online (Sandbox Code Playgroud)

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

在此处输入图片说明

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

  2. 我的表中的节点不会扩展。但

    public int getChildCount(Object parent_object_id)

返回数字 > 0

ps我知道可能没有足够的信息来直接回答,但我至少需要指导我可以继续我的调查。

小智 0

与您的第一个问题相关,您应该实现 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;
  }
}
Run Code Online (Sandbox Code Playgroud)

当前发生的情况是,您的 Cell 渲染器返回对象实例元素 ID(例如 DictionaryItem@11abb71),而不是获取对象并调用 getID() 函数。

您可以在 TreeCellRenderer 示例中找到额外的示例和信息

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