2013-10-21 26 views
1

我正在開發基於NetBeans平臺的應用程序。如何從當前順序的OutlineView中獲取節點?

在一個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 
    } 

他們仍然會按照原來的順序...

所以不要有誰知道我應該讓他們在新的排序順序?

回答

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; 
    } 
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。

[西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] 

[(1,3)]

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

這是不完全乾淨的,但它會打印命令文本如你所願。

相關問題