有个问题希望指教:
怎样给一个JXTreeTable写“ColumnSorter”呢,以至于一树表可按列排序?在网上查了很久,每发现可参考的资料。
这个和ModelListener有关吗,因为JTable用得是TableModelListener,而JXTreeTable用得是TreeTableModel,不管是Default还是Abstract,里面挂的都是TreeModelListener。JXTreeTable standard 提供的 setSortable又是空架子,不能用。哪位能给出实例代码就更感激不尽了。能给出个参考链接也行多谢!
怎样给一个JXTreeTable写“ColumnSorter”呢,以至于一树表可按列排序?在网上查了很久,每发现可参考的资料。
这个和ModelListener有关吗,因为JTable用得是TableModelListener,而JXTreeTable用得是TreeTableModel,不管是Default还是Abstract,里面挂的都是TreeModelListener。JXTreeTable standard 提供的 setSortable又是空架子,不能用。哪位能给出实例代码就更感激不尽了。能给出个参考链接也行多谢!
public void sort(Object sender)
{
compares = 0;
oldnodes = (CustomerTreeTableNode[])indexes.clone();
shuttlesort((CustomerTreeTableNode[])indexes.clone(), indexes, 0, indexes.length);
}
public void n2sort()
{
for(int i = 0; i < super.getChildCount(_root); i++)
{
for(int j = i+1; j < super.getChildCount(_root); j++)
{
if (compare(indexes[i], indexes[j]) == -1)
{
swap(i, j);
}
}
}
}
public void shuttlesort(CustomerTreeTableNode from[], CustomerTreeTableNode to[], int low, int high)
{
if (high - low < 2)
{
return;
}
int middle = (low + high)/2;
shuttlesort(to, from, low, middle);
shuttlesort(to, from, middle, high);
int p = low;
int q = middle;
if (high - low >= 4 && compare(from[middle-1], from[middle]) <= 0)
{
for (int i = low; i < high; i++)
{
to[i] = from[i];
}
return;
}
for(int i = low; i < high; i++)
{
if (q >= high || (p < middle && compare(from[p], from[q]) <= 0))
{
to[i] = from[p++];
}
else
{
to[i] = from[q++];
}
}
}
public void swap(int i, int j)
{
CustomerTreeTableNode tmp = indexes[i];
indexes[i] = indexes[j];
indexes[j] = tmp;
}
public void sortByColumn(int column, boolean ascending)
{
this.ascending = ascending;
sortingColumns.removeAllElements();
sortingColumns.addElement(new Integer(column));
sort(this);
// old index must be saved
// nodes must be new arranged to update the tree
indxs = new Vector();
for(int l=0; l<_root.getChildCount();l++){
oldttn.add(getPathToRoot((CustomerTreeTableNode) _root.getChildAt(l)));
indxs.add(l);
}
for(int k=0; k<oldnodes.length;k++){
CustomerTreeTableNode oldn = oldnodes[k];
_root.remove(oldn);
}
for(int i = 0; i<indexes.length;i++){
CustomerTreeTableNode sr = indexes[i];
_root.insert(sr, i);
}
//fireTreeStructureChanged() is not good to use....
// for(int t=0; t<_root.getChildCount();t++){ //(TreeTableNode[])oldttn.get(t)
// fireTreeStructureChanged(this,getPathToRoot((CustomerTreeTableNode) _root.getChildAt(t)), null,null);
// }
}
public void treeNodesChanged(TreeModelEvent e) {
}
public void treeNodesInserted(TreeModelEvent e) {
}
public void treeNodesRemoved(TreeModelEvent e) {
}
public void treeStructureChanged(TreeModelEvent e) {
}
public void addMouseListenerToHeaderInTable(JXTreeTable table)
{
final TreeTableSorter sorter = this;
final JXTreeTable tableView = table;
tableView.setColumnSelectionAllowed(false);
MouseAdapter listMouseListener = new MouseAdapter()
{
@Override
public void mouseClicked(MouseEvent e)
{
TableColumnModel columnModel = tableView.getColumnModel();
int viewColumn = columnModel.getColumnIndexAtX(e.getX());
int column = tableView.convertColumnIndexToModel(viewColumn);
if(e.getClickCount() == 1 && column != -1)
{
int shiftPressed = e.getModifiers()&InputEvent.SHIFT_MASK;
boolean ascending = (shiftPressed == 0);
sorter.sortByColumn(column, ascending);
tableView.setTreeTableModel(new DynamicTreeTableModel(_root,_cols)); //update Model
}
}
};
JTableHeader th = tableView.getTableHeader();
th.addMouseListener(listMouseListener);
}
}[/code]