亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? tablesorter.java

?? jsp應(yīng)用編程
?? JAVA
字號:
/* * @(#)TableSorter.java	1.10 01/12/03 * * Copyright 2002 Sun Microsystems, Inc. All rights reserved. * SUN PROPRIETARY/CONFIDENTIAL. Use is subject to license terms. *//** * A sorter for TableModels. The sorter has a model (conforming to TableModel)  * and itself implements TableModel. TableSorter does not store or copy  * the data in the TableModel, instead it maintains an array of  * integers which it keeps the same size as the number of rows in its  * model. When the model changes it notifies the sorter that something  * has changed eg. "rowsAdded" so that its internal array of integers  * can be reallocated. As requests are made of the sorter (like  * getValueAt(row, col) it redirects them to its model via the mapping  * array. That way the TableSorter appears to hold another copy of the table  * with the rows in a different order. The sorting algorthm used is stable  * which means that it does not move around rows when its comparison  * function returns 0 to denote that they are equivalent.  * * @version 1.10 12/03/01 * @author Philip Milne */import java.util.*;import javax.swing.table.TableModel;import javax.swing.event.TableModelEvent;// Imports for picking up mouse events from the JTable. import java.awt.event.MouseAdapter;import java.awt.event.MouseEvent;import java.awt.event.InputEvent;import javax.swing.JTable;import javax.swing.table.JTableHeader;import javax.swing.table.TableColumn;import javax.swing.table.TableColumnModel;public class TableSorter extends TableMap{    int             indexes[];    Vector          sortingColumns = new Vector();    boolean         ascending = true;    int compares;    public TableSorter()    {        indexes = new int[0]; // For consistency.            }    public TableSorter(TableModel model)    {        setModel(model);    }    public void setModel(TableModel model) {        super.setModel(model);         reallocateIndexes();     }    public int compareRowsByColumn(int row1, int row2, int column)    {        Class type = model.getColumnClass(column);        TableModel data = model;        // Check for nulls        Object o1 = data.getValueAt(row1, column);        Object o2 = data.getValueAt(row2, column);         // If both values are null return 0        if (o1 == null && o2 == null) {            return 0;         }        else if (o1 == null) { // Define null less than everything.             return -1;         }         else if (o2 == null) {             return 1;         }/* We copy all returned values from the getValue call in casean optimised model is reusing one object to return many values.The Number subclasses in the JDK are immutable and so will not be used in this way but other subclasses of Number might want to do this to save space and avoid unnecessary heap allocation. */        if (type.getSuperclass() == java.lang.Number.class)            {                Number n1 = (Number)data.getValueAt(row1, column);                double d1 = n1.doubleValue();                Number n2 = (Number)data.getValueAt(row2, column);                double d2 = n2.doubleValue();                if (d1 < d2)                    return -1;                else if (d1 > d2)                    return 1;                else                    return 0;            }        else if (type == java.util.Date.class)            {                Date d1 = (Date)data.getValueAt(row1, column);                long n1 = d1.getTime();                Date d2 = (Date)data.getValueAt(row2, column);                long n2 = d2.getTime();                if (n1 < n2)                    return -1;                else if (n1 > n2)                    return 1;                else return 0;            }        else if (type == String.class)            {                String s1 = (String)data.getValueAt(row1, column);                String s2    = (String)data.getValueAt(row2, column);                int result = s1.compareTo(s2);                if (result < 0)                    return -1;                else if (result > 0)                    return 1;                else return 0;            }        else if (type == Boolean.class)            {                Boolean bool1 = (Boolean)data.getValueAt(row1, column);                boolean b1 = bool1.booleanValue();                Boolean bool2 = (Boolean)data.getValueAt(row2, column);                boolean b2 = bool2.booleanValue();                if (b1 == b2)                    return 0;                else if (b1) // Define false < true                    return 1;                else                    return -1;            }        else            {                Object v1 = data.getValueAt(row1, column);                String s1 = v1.toString();                Object v2 = data.getValueAt(row2, column);                String s2 = v2.toString();                int result = s1.compareTo(s2);                if (result < 0)                    return -1;                else if (result > 0)                    return 1;                else return 0;            }    }    public int compare(int row1, int row2)    {        compares++;        for(int level = 0; level < sortingColumns.size(); level++)            {                Integer column = (Integer)sortingColumns.elementAt(level);                int result = compareRowsByColumn(row1, row2, column.intValue());                if (result != 0)                    return ascending ? result : -result;            }        return 0;    }    public void  reallocateIndexes()    {        int rowCount = model.getRowCount();        // Set up a new array of indexes with the right number of elements        // for the new data model.        indexes = new int[rowCount];        // Initialise with the identity mapping.        for(int row = 0; row < rowCount; row++)            indexes[row] = row;    }    public void tableChanged(TableModelEvent e)    {	System.out.println("Sorter: tableChanged");         reallocateIndexes();        super.tableChanged(e);    }    public void checkModel()    {        if (indexes.length != model.getRowCount()) {            System.err.println("Sorter not informed of a change in model.");        }    }    public void  sort(Object sender)    {        checkModel();        compares = 0;        // n2sort();        // qsort(0, indexes.length-1);        shuttlesort((int[])indexes.clone(), indexes, 0, indexes.length);        System.out.println("Compares: "+compares);    }    public void n2sort() {        for(int i = 0; i < getRowCount(); i++) {            for(int j = i+1; j < getRowCount(); j++) {                if (compare(indexes[i], indexes[j]) == -1) {                    swap(i, j);                }            }        }    }    // This is a home-grown implementation which we have not had time    // to research - it may perform poorly in some circumstances. It    // requires twice the space of an in-place algorithm and makes    // NlogN assigments shuttling the values between the two    // arrays. The number of compares appears to vary between N-1 and    // NlogN depending on the initial order but the main reason for    // using it here is that, unlike qsort, it is stable.    public void shuttlesort(int from[], int 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;        /* This is an optional short-cut; at each recursive call,        check to see if the elements in this subset are already        ordered.  If so, no further comparisons are needed; the        sub-array can just be copied.  The array must be copied rather        than assigned otherwise sister calls in the recursion might        get out of sinc.  When the number of elements is three they        are partitioned so that the first set, [low, mid), has one        element and and the second, [mid, high), has two. We skip the        optimisation when the number of elements is three or less as        the first compare in the normal merge will produce the same        sequence of steps. This optimisation seems to be worthwhile        for partially ordered lists but some analysis is needed to        find out how the performance drops to Nlog(N) as the initial        order diminishes - it may drop very quickly.  */        if (high - low >= 4 && compare(from[middle-1], from[middle]) <= 0) {            for (int i = low; i < high; i++) {                to[i] = from[i];            }            return;        }        // A normal merge.         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) {        int tmp = indexes[i];        indexes[i] = indexes[j];        indexes[j] = tmp;    }    // The mapping only affects the contents of the data rows.    // Pass all requests to these rows through the mapping array: "indexes".    public Object getValueAt(int aRow, int aColumn)    {        checkModel();        return model.getValueAt(indexes[aRow], aColumn);    }    public void setValueAt(Object aValue, int aRow, int aColumn)    {        checkModel();        model.setValueAt(aValue, indexes[aRow], aColumn);    }    public void sortByColumn(int column) {        sortByColumn(column, true);    }    public void sortByColumn(int column, boolean ascending) {        this.ascending = ascending;        sortingColumns.removeAllElements();        sortingColumns.addElement(new Integer(column));        sort(this);        super.tableChanged(new TableModelEvent(this));     }    // There is no-where else to put this.     // Add a mouse listener to the Table to trigger a table sort     // when a column heading is clicked in the JTable.     public void addMouseListenerToHeaderInTable(JTable table) {         final TableSorter sorter = this;         final JTable tableView = table;         tableView.setColumnSelectionAllowed(false);         MouseAdapter listMouseListener = new MouseAdapter() {            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) {                    System.out.println("Sorting ...");                     int shiftPressed = e.getModifiers()&InputEvent.SHIFT_MASK;                     boolean ascending = (shiftPressed == 0);                     sorter.sortByColumn(column, ascending);                 }             }         };        JTableHeader th = tableView.getTableHeader();         th.addMouseListener(listMouseListener);     }}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久疯狂做爰流白浆xx| 亚洲国产经典视频| 天天射综合影视| 91精品国产入口| 久久国产夜色精品鲁鲁99| 精品国产伦理网| 高清成人免费视频| 国产精品国产三级国产aⅴ原创 | 6080国产精品一区二区| 肉色丝袜一区二区| 欧美不卡一区二区三区| 国产成人aaa| 亚洲一区二区五区| 欧美成人免费网站| 成人激情小说网站| 夜色激情一区二区| 日韩欧美国产一区在线观看| 国产成人综合亚洲网站| 亚洲精品日韩一| 亚洲一二三区在线观看| 91麻豆精品国产| 国产成人精品三级麻豆| 亚洲专区一二三| 精品国产人成亚洲区| 99精品偷自拍| 日本伊人午夜精品| 一色桃子久久精品亚洲| 欧美日韩dvd在线观看| 国产精品18久久久| 亚洲一二三四区| 久久久久亚洲综合| 欧美网站大全在线观看| 国产福利一区二区三区在线视频| 亚洲美女淫视频| 欧美电影免费观看高清完整版| 成人午夜伦理影院| 热久久国产精品| 国产精品国产自产拍在线| 日韩一级高清毛片| 色婷婷激情一区二区三区| 久久国产精品99久久人人澡| 亚洲免费av观看| 国产亚洲女人久久久久毛片| 欧美日韩免费在线视频| 成人午夜免费电影| 精品一区二区三区视频| 亚洲一区精品在线| 国产精品久久一卡二卡| 精品久久久久久久久久久院品网| 在线观看不卡视频| 国产69精品一区二区亚洲孕妇| 青青草视频一区| 亚洲一区二区三区视频在线| 国产精品成人午夜| 久久久综合视频| 欧美一级欧美三级在线观看| 一本久久a久久精品亚洲| 国产精品自拍三区| 黑人精品欧美一区二区蜜桃| 秋霞av亚洲一区二区三| 亚洲电影在线播放| 自拍偷拍欧美精品| 中文字幕精品综合| 国产天堂亚洲国产碰碰| 欧美不卡一区二区三区四区| 日韩视频一区二区三区在线播放| 欧美日韩三级一区| 欧美日韩视频在线一区二区| 91成人国产精品| 色婷婷综合久久| 91福利区一区二区三区| 91国产精品成人| 一本色道久久综合亚洲91| aaa欧美大片| 色综合天天综合网天天看片| 色网站国产精品| 欧美亚洲综合在线| 欧美日韩一区二区三区在线 | 制服.丝袜.亚洲.中文.综合| 欧美视频中文字幕| 欧美日本一区二区在线观看| 51精品国自产在线| 91精品综合久久久久久| 日韩一区二区三区在线| 日韩美女在线视频| 2021国产精品久久精品| 麻豆成人免费电影| 国产美女主播视频一区| 豆国产96在线|亚洲| av高清久久久| 一本久道中文字幕精品亚洲嫩| 在线影视一区二区三区| 欧美伊人久久久久久久久影院 | 欧美精品一区二区三区很污很色的| 日韩欧美视频一区| 久久亚洲捆绑美女| 国产精品麻豆一区二区 | 亚洲精品一区二区三区99| 久久嫩草精品久久久精品一| 国产清纯美女被跳蛋高潮一区二区久久w| 国产日韩欧美一区二区三区综合| 国产精品成人一区二区三区夜夜夜| 亚洲色图20p| 日韩av电影免费观看高清完整版 | 亚洲国产欧美一区二区三区丁香婷| 亚洲国产综合在线| 免费在线看一区| 丰满白嫩尤物一区二区| 欧美午夜一区二区三区免费大片| 91精品国产综合久久香蕉的特点| 欧美精品一区二区三| 亚洲男女毛片无遮挡| 免费欧美在线视频| 成人高清免费在线播放| 欧美日韩一区二区三区视频| 久久综合九色综合欧美就去吻| 成人欧美一区二区三区白人| 亚洲成人免费观看| 大桥未久av一区二区三区中文| 欧美视频你懂的| 欧美国产一区在线| 日韩高清欧美激情| 99久久精品国产麻豆演员表| 日韩限制级电影在线观看| 综合色中文字幕| 久久99精品国产91久久来源| 色综合夜色一区| 久久久www免费人成精品| 亚洲成人777| 91亚洲精华国产精华精华液| 精品不卡在线视频| 亚洲综合一区二区三区| 国产99久久久国产精品免费看 | 91婷婷韩国欧美一区二区| 日韩一级免费观看| 亚洲曰韩产成在线| 国产成人免费网站| 欧美一级电影网站| 亚洲自拍偷拍综合| 91色在线porny| 欧美精彩视频一区二区三区| 麻豆国产精品官网| 欧美日韩成人激情| 亚洲激情自拍视频| 成人黄色在线网站| 久久亚洲精精品中文字幕早川悠里 | 亚洲欧洲综合另类| 国产精品自拍一区| 精品日韩成人av| 日本欧美一区二区三区乱码| 91国在线观看| 一级中文字幕一区二区| 91丝袜美腿高跟国产极品老师 | www成人在线观看| 在线观看三级视频欧美| 中文字幕一区二区在线观看| 国产高清精品久久久久| 国产亚洲自拍一区| 国模套图日韩精品一区二区| 精品少妇一区二区三区免费观看 | 亚洲高清不卡在线观看| 色婷婷综合五月| 亚洲日穴在线视频| 91麻豆精东视频| 亚洲免费观看在线视频| eeuss鲁片一区二区三区在线观看 eeuss鲁片一区二区三区在线看 | 久久99精品国产.久久久久| 欧美一区二区三区视频在线 | 26uuuu精品一区二区| 麻豆91免费观看| 久久综合九色综合97婷婷| 久草中文综合在线| 精品国产亚洲在线| 国产精品99久久久久| 久久久久国色av免费看影院| 国产99一区视频免费| 国产精品久久久久久久久图文区| 成人激情午夜影院| 亚洲乱码中文字幕| 欧美日韩一区在线| 美女精品一区二区| 久久青草国产手机看片福利盒子 | 国产综合久久久久久久久久久久| 精品美女在线观看| 国产ts人妖一区二区| 1000部国产精品成人观看| 色综合天天综合在线视频| 亚洲aⅴ怡春院| 欧美一区二区播放| 国产成人免费av在线| 亚洲美女区一区| 3d成人动漫网站| 国产一区二区在线观看免费| 国产精品拍天天在线| 欧美做爰猛烈大尺度电影无法无天| 亚洲国产综合91精品麻豆| 精品国产网站在线观看| 99riav久久精品riav| 日韩va欧美va亚洲va久久| 久久精品欧美日韩精品|