0

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

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

具体来说,我有多个版本的对象,我想使用 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()

4

1 回答 1

0

但我需要从模型中知道这一点。

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

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

于 2014-04-14T16:46:32.387 回答