Как получить узлы из OutlineView в текущем порядке?

Я разрабатываю приложение на платформе netbeans.

В одном TopComponent я создаю подкласс OutlineView для отображения набора узлов. Этот OutlineView имеет несколько столбцов, которые пользователь может использовать для сортировки набора узлов по различным свойствам.

Моя проблема в том, что после того, как я отсортировал узлы (из графического интерфейса, нажав на столбцы), я хотел бы получить набор узлов в их текущем упорядоченном состоянии. Я не нашел способ сделать это?

Вот как мог бы выглядеть мой 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
    }

Они останутся в первоначальном порядке...

Так кто-нибудь знает, как я должен получить их в новом отсортированном порядке?


person bjarven    schedule 21.10.2013    source источник


Ответы (2)


Хорошо, я нашел решение, достаточное для моих нужд, не очень красивое, но я решил поделиться им. Я добавил прослушиватель модели столбца, который будет вызываться, когда пользователь нажимает на столбец, а затем через некоторое время получает отсортированные узлы.

Меня все еще интересует способ прослушивания сортировки, так как этот слушатель модели столбца не очень красив...

    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;
    }
person bjarven    schedule 05.11.2013

Я думаю, что проблема здесь в том, что вы смотрите только на модель и менеджер проводника. Сама таблица содержит отображаемые данные, а модель содержит фактические данные. Если вы посмотрите прямо на Outline, вы увидите порядок отображения вещей.

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]

Это не совсем чисто, но текст будет напечатан так, как вы хотите.

person SlopeOak    schedule 03.06.2015