如何从当前顺序中的OutlineView获取节点?

时间:2013-10-21 14:39:38

标签: java netbeans-platform

我正在开发基于netbeans平台的应用程序。

在一个TopComponent中,我将OutlineView子类化以显示节点集合。此OutlineView具有一些列,用户可以使用这些列对不同属性上的节点集合进行排序。

我的问题是,在我对节点进行排序后(从GUI中点击列),我希望节点集合处于当前有序状态。我还没有办法做到这一点?

这是我的OutlineView看起来的样子......(在排序之前)

------------------------
|Nodes | Prop1 | Prop2 |
|-----------------------
|Node1 |   1   |   a   |
|-----------------------
|Node2 |   5   |   y   |
|----------------------
|Node3 |   2   |   h   |
|-----------------------
|Node4 |   3   |   x   |
|-----------------------

然后在点击“Prop1”后,它将被重新排列。

如果我从ExplorerManager获取节点,则它们按原始顺序排列,而不是按排序顺序排列。

如果我从模型中获取节点;

  for (int i = 0; i < getOutline().getModel().getRowCount(); i++) {
        TreeNode treeNode = (TreeNode) getOutline().getModel().getValueAt(i, 0);
        // still in the original order
    }

他们仍然是原来的顺序......

所以有人知道我应该如何以新的排序顺序获取它们吗?

2 个答案:

答案 0 :(得分:0)

好的,我找到了一个足以满足我需求的解决方案,不是很漂亮,但我想我会分享它。我添加了一个列模型侦听器,当用户单击该列时将调用该模型,然后在一段时间后获取已排序的节点。

我仍然对监听排序感兴趣,因为这个列模型监听器感觉不太漂亮...

    getOutline().getColumnModel().addColumnModelListener(new TableColumnModelListener() {

        @Override
        public void columnAdded(TableColumnModelEvent tcme) { }

        @Override
        public void columnRemoved(TableColumnModelEvent tcme) { }

        @Override
        public void columnMoved(TableColumnModelEvent tcme) {


            /* Must be done with invoke later, since    
             * this will be called when the user clicks on the column, not
             * when the actual sorting takes place...
             */
            SwingUtilities.invokeLater(new Runnable() {
                @Override
                public void run() {
                    getSortedNodes();
                }
            });
        }

        @Override
        public void columnMarginChanged(ChangeEvent ce) { }

        @Override
        public void columnSelectionChanged(ListSelectionEvent lse) { }
    });


private List<Node> getSortedNodes() {
        List<Node> sortedNodes = new ArrayList<>();
        for (int i = 0; i < getOutline().getRowCount(); i++) {
            int sortedIndex = getOutline().convertRowIndexToModel(i);
            ETable.RowMapping mapping = new ETable.RowMapping(sortedIndex, getOutline().getModel(), getOutline());
            Node node = (Node) mapping.getTransformedValue(0);
            sortedNodes.add(node);
        }
        return sortedNodes;
    }

答案 1 :(得分:0)

我认为这里的问题是你只关注模型和资源管理器经理。表本身保存其显示数据,模型保存实际数据。如果直接查看大纲,您可以看到订单显示的顺序。

public void actionPerformed(ActionEvent e) {
    final Outline outline = ov.getOutline();
    int cols = outline.getColumnCount();
    int rows = outline.getRowCount();
    for (int i = 0; i < rows; i++) {
        for (int j = 0; j < cols; j++) {
            System.out.print(outline.getValueAt(i, j) + ", ");
        }
        System.out.println();
    }
}

输出未排序:

[Col 1]

Table: contentmanagement-gui.xml
Model: contentmanagement-gui.xml

[Col 2]

Table: org.openide.nodes.PropertySupport$Reflection[name=updated]
Model: org.openide.nodes.PropertySupport$Reflection[name=updated]

[Col 3]

Table: org.openide.nodes.PropertySupport$Reflection[name=installedTime]
Model: org.openide.nodes.PropertySupport$Reflection[name=installedTime]

排序树节点升序后的输出,并将树列移动到位置2。

[Col 1]

Table: org.openide.nodes.PropertySupport$Reflection[name=updated]
Model: contentmanagement-gui.xml

[Col 2]

Table: beansbinding-1.2.1.jar
Model: org.openide.nodes.PropertySupport$Reflection[name=updated]

[Col 3]

Table: org.openide.nodes.PropertySupport$Reflection[name=installedTime]
Model: org.openide.nodes.PropertySupport$Reflection[name=installedTime]

这不是很干净,但会打印您想要的文字。