如何知道SwingX TreeTableModel中的节点是否已展开?

时间:2014-04-14 16:32:49

标签: java swingx jxtreetable

是否可以从SwingX的TreeTableModel / AbstractTreeTableModel(特别是getValueAt(Object node, int index)方法)中检测节点是展开还是折叠?我需要为父节点显示不同的值,具体取决于它是展开还是折叠。 (我意识到这违反了分离模型和视图的原则,抱歉!)

我知道你可以使用标准isExpanded()isCollapsed()方法从JXTreeTable对象中检查这个,但我需要在模型中知道这一点。

具体来说,我有多个版本的对象,我想使用JXTreeTable来支持扩展/折叠版本。如果对象已折叠,我希望父节点显示所有版本的值的摘要。如果它已展开,我希望父级只显示当前版本的值(最重要的一个),并且不再需要或不需要摘要。

一些伪代码可以让您了解我的意思:

getValueAt(Object node, int index) {
    if (node.hasChildren()) {
        if (node.isExpanded()) {  // this is the part I'm not sure how to implement
            return node.getCurrentValue();  // eg "Current version: C"
        }
        else {
            return node.getSummaryValue();  // eg "Current version: C; previous versions: A, B"
        }
    }
    else {
        return node.getValue();  // eg "Version: B"
    }
}

修改

谢谢camickr,你当然是对的,我的问题无效! (我现在觉得有点蠢。)

您是否建议使用自定义TreeCellRenderer,以便根据节点的扩展状态选择要显示的值?也就是说,让模型提供一个实现如下内容的对象:

public interface ExpansionStateDependentValue {

    public Object getDisplayValue(boolean expanded);

}

然后让TreeCellRenderer使用此方法(假设单元格值实现接口)根据expanded方法中的getTreeCellRendererComponent()标志显示适当的值?

1 个答案:

答案 0 :(得分:0)

  

但我需要从模型中了解这一点。

许多View组件可以共享模型。也就是说它可以被两个不同的JTree对象使用。因此,有可能在树的一个视图中扩展节点代码,而在另一个视图中不扩展。

因此,您的问题的答案是模型不包含此信息,因为它是视图的一个功能。因此,您尝试在模型中执行此操作的方法是不正确的。