有个问题希望指教:
怎样给一个JXTreeTable写“ColumnSorter”呢,以至于一树表可按列排序?在网上查了很久,每发现可参考的资料。
这个和ModelListener有关吗,因为JTable用得是TableModelListener,而JXTreeTable用得是TreeTableModel,不管是Default还是Abstract,里面挂的都是TreeModelListener。JXTreeTable standard 提供的 setSortable又是空架子,不能用。哪位能给出实例代码就更感激不尽了。能给出个参考链接也行多谢!

解决方案 »

  1.   

    jdk1.5.0_04\demo\jfc\TableExample\src\TableExample4.java
      

  2.   

    To yangting_lisa (笨笨熊): 多谢, by the way, 这部分属于swingx包。To softroad:也多谢你,但链接打不开,另外看链接文字中有“ TableExample”,不知到是不是jxtreetable相关?
      

  3.   


        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]