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

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

?? tablesorter.java

?? 使用jpcap實(shí)現(xiàn)的實(shí)時(shí)抓包、協(xié)議分析軟件
?? JAVA
字號(hào):
/**
 * 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.5 12/17/97
 * @author Philip Milne
 * @modified Keita Fujii
 */

package jdumper.ui;
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.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; 
        }
        
        if(o1.getClass() != o2.getClass())
        	return -1;
				Class type=o1.getClass();
				
        /*
         * We copy all returned values from the getValue call in case
         * an 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()) {
				    reallocateIndexes();
            //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 int getOriginalIndex(int index){
			return indexes[index];
		}

    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
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美精品黑人性xxxx| 亚洲成人资源在线| 成人中文字幕在线| 精品国产露脸精彩对白| 国产精品一区二区免费不卡| 中文字幕第一区综合| av在线播放成人| 一区二区三区中文字幕在线观看| 美腿丝袜亚洲色图| 欧美日韩国产色站一区二区三区| 一区二区三区在线免费| 色老汉一区二区三区| 天天影视色香欲综合网老头| 日韩一区二区在线播放| 国产精一区二区三区| 日韩毛片精品高清免费| 欧美日韩视频在线一区二区| 久草在线在线精品观看| 国产精品久久久久久久久免费相片| 97久久久精品综合88久久| 亚洲高清在线视频| 久久久99久久| 欧美性大战久久久久久久| 精品亚洲成av人在线观看| 亚洲欧洲日韩综合一区二区| 91成人免费在线视频| 亚洲欧美一区二区三区久本道91| 亚洲成人免费在线观看| 久久日一线二线三线suv| 久久激五月天综合精品| 欧美www视频| 99久久精品国产毛片| 日本美女视频一区二区| 久久精品视频一区二区| 91老师国产黑色丝袜在线| 麻豆成人在线观看| 亚洲天堂福利av| 日韩一区二区免费视频| 91在线视频官网| 久久爱另类一区二区小说| 中文字幕在线播放不卡一区| 91精品国产91久久综合桃花| heyzo一本久久综合| 日韩1区2区3区| 亚洲视频网在线直播| 久久久一区二区三区捆绑**| 欧美日韩精品三区| 99国产精品国产精品毛片| 国产在线精品免费av| 五月婷婷激情综合| av高清久久久| 欧美日精品一区视频| 黄一区二区三区| 亚洲摸摸操操av| 欧美一卡二卡在线观看| 91黄视频在线观看| 成人国产精品免费| 久久精品99国产国产精| 午夜影院久久久| 一区二区三区国产| 国产精品色婷婷久久58| 2023国产精华国产精品| 欧美一区二区三区影视| 欧美日韩免费高清一区色橹橹| av一二三不卡影片| 成人精品一区二区三区中文字幕 | 欧美精品一区视频| 在线不卡中文字幕播放| 欧美日韩一级二级三级| 欧美网站一区二区| 在线观看视频欧美| 欧美中文字幕亚洲一区二区va在线 | 久久国产视频网| 天天综合网天天综合色| 日韩精品一二三四| 五月天中文字幕一区二区| 五月天欧美精品| 日韩高清一级片| 青娱乐精品视频| 免费在线观看精品| 麻豆91小视频| 国产乱码精品1区2区3区| 国产在线一区观看| 国产精品77777| 成人av动漫在线| 91在线观看地址| 欧美亚洲日本一区| 欧美日韩极品在线观看一区| 精品视频在线免费| 91精品在线免费观看| 日韩免费高清电影| 国产日韩视频一区二区三区| 久久九九全国免费| 成人欧美一区二区三区| 亚洲一区二区偷拍精品| 爽好多水快深点欧美视频| 美美哒免费高清在线观看视频一区二区 | 亚洲国产精品99久久久久久久久| 中文欧美字幕免费| 亚洲精品视频在线| 婷婷丁香激情综合| 黑人巨大精品欧美黑白配亚洲| 福利视频网站一区二区三区| 91麻豆成人久久精品二区三区| 精品视频在线免费| 精品国产91洋老外米糕| 国产精品久久久久久久裸模| 亚洲大型综合色站| 国产成人免费视| 欧美性淫爽ww久久久久无| 日韩女同互慰一区二区| 中文字幕在线一区免费| 午夜av区久久| 国产成人精品三级麻豆| 在线观看视频一区二区 | 欧美绝品在线观看成人午夜影视| 在线视频国内一区二区| 亚洲精品乱码久久久久久久久| 亚洲国产成人av好男人在线观看| 日韩精品一区第一页| 成人免费视频一区| 欧美日韩一级视频| 中文字幕国产一区二区| 丝袜美腿亚洲色图| 成人黄色av电影| 欧美一区二区在线观看| 中文字幕 久热精品 视频在线| 亚洲综合激情网| 国产成人a级片| 欧美日韩一级二级三级| 国产精品久线观看视频| 美国三级日本三级久久99| 99精品视频在线观看免费| 日韩女优av电影| 日韩avvvv在线播放| 99国内精品久久| 久久久久久日产精品| 婷婷一区二区三区| 91视频在线观看| 国产调教视频一区| 日韩电影一二三区| 欧美中文字幕一区二区三区亚洲 | 国产河南妇女毛片精品久久久| 在线观看免费视频综合| 欧美激情一区二区三区蜜桃视频| 日韩成人av影视| 欧美亚洲综合久久| 中文字幕在线播放不卡一区| 国内精品免费**视频| 欧美精品乱码久久久久久按摩| 国产精品国产三级国产有无不卡| 久久精品国产亚洲高清剧情介绍| 欧美亚洲精品一区| 亚洲精品国久久99热| 成人av资源站| 国产亲近乱来精品视频| 精品一二三四在线| 日韩美女主播在线视频一区二区三区| 亚洲亚洲精品在线观看| 欧美综合一区二区| 一区二区三区中文字幕精品精品| 99精品久久99久久久久| 国产精品久久一级| 99视频热这里只有精品免费| 国产精品乱人伦中文| 成人福利视频在线| 日韩一区欧美小说| av不卡一区二区三区| 日韩毛片精品高清免费| 日本道免费精品一区二区三区| 亚洲人被黑人高潮完整版| 色乱码一区二区三区88| 亚洲美女一区二区三区| 91极品视觉盛宴| 水野朝阳av一区二区三区| 欧美一区二区视频观看视频| 蜜桃久久av一区| 日韩精品一区二| 国产精品1区二区.| 国产精品家庭影院| 91麻豆精东视频| 婷婷久久综合九色国产成人| 欧美电影免费观看高清完整版在线观看 | 99精品视频在线免费观看| 亚洲乱码国产乱码精品精的特点| 91丝袜高跟美女视频| 一区2区3区在线看| 91精品免费观看| 久久精品999| 中文字幕亚洲在| 欧美日本免费一区二区三区| 免费人成精品欧美精品| 久久久综合视频| 色八戒一区二区三区| 日韩精品福利网| 国产日韩av一区| 欧美性大战久久久久久久蜜臀 | 538在线一区二区精品国产| 狠狠色综合日日| 国产精品卡一卡二|