我正在开发基于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
}
他们仍然是原来的顺序......
所以有人知道我应该如何以新的排序顺序获取它们吗?
答案 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]
这不是很干净,但会打印您想要的文字。