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

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

?? tablesorter.java

?? 這是一個用Jtable的一個學(xué)習(xí)的例子,內(nèi)容比較簡單,但很實用!
?? JAVA
字號:
/* * @(#)TableSorter.java	1.14 04/07/26 *  * Copyright (c) 2004 Sun Microsystems, Inc. All Rights Reserved. *  * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: *  * -Redistribution of source code must retain the above copyright notice, this *  list of conditions and the following disclaimer. *  * -Redistribution in binary form must reproduce the above copyright notice,  *  this list of conditions and the following disclaimer in the documentation *  and/or other materials provided with the distribution. *  * Neither the name of Sun Microsystems, Inc. or the names of contributors may  * be used to endorse or promote products derived from this software without  * specific prior written permission. *  * This software is provided "AS IS," without a warranty of any kind. ALL  * EXPRESS OR IMPLIED CONDITIONS, REPRESENTATIONS AND WARRANTIES, INCLUDING * ANY IMPLIED WARRANTY OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE * OR NON-INFRINGEMENT, ARE HEREBY EXCLUDED. SUN MIDROSYSTEMS, INC. ("SUN") * AND ITS LICENSORS SHALL NOT BE LIABLE FOR ANY DAMAGES SUFFERED BY LICENSEE * AS A RESULT OF USING, MODIFYING OR DISTRIBUTING THIS SOFTWARE OR ITS * DERIVATIVES. IN NO EVENT WILL SUN OR ITS LICENSORS BE LIABLE FOR ANY LOST  * REVENUE, PROFIT OR DATA, OR FOR DIRECT, INDIRECT, SPECIAL, CONSEQUENTIAL,  * INCIDENTAL OR PUNITIVE DAMAGES, HOWEVER CAUSED AND REGARDLESS OF THE THEORY  * OF LIABILITY, ARISING OUT OF THE USE OF OR INABILITY TO USE THIS SOFTWARE,  * EVEN IF SUN HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. *  * You acknowledge that this software is not designed, licensed or intended * for use in the design, construction, operation or maintenance of any * nuclear facility. *//* * @(#)TableSorter.java	1.14 04/07/26 *//** * 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.14 07/26/04 * @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一区二区三区免费野_久草精品视频
亚洲精品你懂的| 午夜精品国产更新| 欧美日韩成人激情| 高清不卡一区二区| 日本成人在线视频网站| 亚洲日本va在线观看| 精品乱码亚洲一区二区不卡| 在线观看免费成人| 国产iv一区二区三区| 麻豆传媒一区二区三区| 亚洲一区二区三区爽爽爽爽爽| 国产日韩欧美精品在线| 日韩亚洲欧美高清| 欧美精品国产精品| 在线观看视频一区二区| eeuss国产一区二区三区| 久久99精品一区二区三区| 亚欧色一区w666天堂| 亚洲精选在线视频| 国产精品久久二区二区| 国产亚洲精品超碰| 日韩欧美aaaaaa| 日韩亚洲欧美中文三级| 欧美另类高清zo欧美| 国产欧美日韩在线| 欧美成人一级视频| 日韩天堂在线观看| 欧美精品xxxxbbbb| 欧美人与禽zozo性伦| 91福利资源站| 菠萝蜜视频在线观看一区| 国产成人在线免费观看| 国产剧情在线观看一区二区| 麻豆成人免费电影| 麻豆成人免费电影| 久久精品国产亚洲aⅴ| 日日欢夜夜爽一区| 日韩中文字幕av电影| 天天操天天色综合| 日韩vs国产vs欧美| 日韩av中文在线观看| 青青国产91久久久久久| 麻豆91精品视频| 捆绑紧缚一区二区三区视频| 美女看a上一区| 国产麻豆视频一区二区| 精彩视频一区二区| 国产高清精品在线| 北岛玲一区二区三区四区| 99精品在线免费| 色菇凉天天综合网| 欧美久久久久久蜜桃| 日韩一区二区影院| wwwwxxxxx欧美| 国产欧美一区二区三区在线看蜜臀| 国产欧美一区视频| 成人欧美一区二区三区白人| 亚洲精品视频一区| 丝袜a∨在线一区二区三区不卡 | 国产精品妹子av| 亚洲人妖av一区二区| 亚洲午夜视频在线观看| 日韩福利电影在线| 国产风韵犹存在线视精品| www.欧美日韩| 欧美高清性hdvideosex| 久久伊人中文字幕| 亚洲免费看黄网站| 视频一区二区国产| 岛国av在线一区| 欧美综合在线视频| 久久人人爽人人爽| 亚洲欧美韩国综合色| 蜜桃免费网站一区二区三区| 国产高清视频一区| 欧美天天综合网| 2021久久国产精品不只是精品| 国产精品欧美久久久久无广告| 亚洲精品国产无天堂网2021| 日韩一区欧美二区| 成人性色生活片| 91精品国产综合久久国产大片| 国产网站一区二区| 午夜精品在线看| 国产盗摄女厕一区二区三区| 欧美午夜片在线观看| 久久精品网站免费观看| 午夜免费欧美电影| 91精品国产免费| 国产精品美女久久久久高潮| 丝袜美腿亚洲一区二区图片| 成人福利视频在线看| 91精品国产色综合久久久蜜香臀| 国产精品素人一区二区| 男人操女人的视频在线观看欧美| 99精品视频在线免费观看| 日韩欧美在线123| 樱桃国产成人精品视频| 国产激情视频一区二区三区欧美| 欧美群妇大交群中文字幕| 成人免费在线播放视频| 韩国精品主播一区二区在线观看 | 欧美日韩一区国产| 国产日韩精品一区| 乱中年女人伦av一区二区| 在线观看国产一区二区| 欧美激情中文不卡| 九九国产精品视频| 欧美日韩国产a| 亚洲免费观看高清完整版在线| 久久99国产精品麻豆| 欧美丰满一区二区免费视频| 亚洲品质自拍视频| 99视频精品免费视频| 国产亚洲一二三区| 精品亚洲porn| 日韩欧美一二三四区| 午夜精品福利一区二区三区av| 色综合久久中文综合久久97| 国产精品久久久久aaaa| 成人午夜电影久久影院| 2021中文字幕一区亚洲| 狠狠色丁香久久婷婷综| 日韩精品一区国产麻豆| 美女网站在线免费欧美精品| 欧美肥大bbwbbw高潮| 香蕉久久一区二区不卡无毒影院| 91久久国产最好的精华液| 中文字幕一区二区三中文字幕| 国产成人精品影视| 久久久久九九视频| 国产成人自拍高清视频在线免费播放| 精品播放一区二区| 国产麻豆成人传媒免费观看| 欧美电视剧在线看免费| 激情综合亚洲精品| 久久新电视剧免费观看| 国产成人精品三级| 国产精品福利一区| 91麻豆免费视频| 亚洲老司机在线| 欧美剧在线免费观看网站| 午夜精品久久久久久| 欧美一级片在线| 老司机精品视频导航| 国产亚洲精久久久久久| 99麻豆久久久国产精品免费| 综合激情网...| 欧美日韩在线不卡| 老司机午夜精品99久久| xnxx国产精品| 国产成人精品免费在线| 亚洲啪啪综合av一区二区三区| 欧美系列日韩一区| 水野朝阳av一区二区三区| 日韩精品一区二区三区在线播放| 国产一区二区三区在线观看精品| 欧美经典三级视频一区二区三区| 99精品欧美一区二区三区小说| 一区二区三区日韩欧美精品| 欧美乱妇一区二区三区不卡视频| 美女视频黄久久| 久久99国产精品免费网站| 久久久国产午夜精品| 色美美综合视频| 免费xxxx性欧美18vr| 国产欧美日韩综合| 91美女在线视频| 免费在线观看日韩欧美| 国产精品日韩成人| 欧美日韩国产片| 国产91对白在线观看九色| 夜色激情一区二区| 欧美sm极限捆绑bd| 91麻豆免费视频| 久久99精品久久久久久| 国产精品毛片a∨一区二区三区| 欧美影院一区二区| 国内精品伊人久久久久av一坑 | 蜜臀av一级做a爰片久久| 中文字幕欧美国产| 欧美日韩视频在线第一区 | 国产拍欧美日韩视频二区| 欧美三级在线看| 成人app网站| 日韩福利电影在线| 亚洲天堂精品在线观看| 日韩欧美一区中文| 日本精品裸体写真集在线观看| 精品一区二区精品| 亚洲一区二区偷拍精品| 中文在线免费一区三区高中清不卡| 欧美日韩一区在线观看| 粉嫩蜜臀av国产精品网站| 青青草97国产精品免费观看无弹窗版| 亚洲欧洲另类国产综合| 精品国产麻豆免费人成网站| 欧美亚洲日本一区| www.99精品| 国产精品一区三区|