1

私は、netbeans プラットフォームに基づくアプリケーションを開発しています。

1 つの 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 に答える