1

我正在开发一个基于 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
    }

它们仍将按原始顺序...

那么有谁知道我应该如何让它们按新的排序顺序排列?

4

2 回答 2

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;
    }
于 2013-11-05T08:56:12.443 回答
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();
    }
}

输出未排序:

[第 1 列]

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

[第 2 列]

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

[第 3 列]

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

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

[第 1 列]

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

[第 2 列]

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

[第 3 列]

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

这并不完全干净,但它会根据需要打印订购的文本。

于 2015-06-03T09:08:02.580 回答