【Java-GUI】对JTable里的元素进行排序

下面是核心内容

响应并处理选中的结点:

        // 设置节点选中监听器
        tree.addTreeSelectionListener(new TreeSelectionListener() {
            @Override
            public void valueChanged(TreeSelectionEvent e) {
                DefaultMutableTreeNode target = (DefaultMutableTreeNode)tree.getLastSelectedPathComponent();
                list = controller.readList(target);
                tableData = controller.showPatients(list);
                tableModel.setDataVector(tableData, tableHeader);
            }
        });

因为我们知道DefaultTableModel里的数据存在二维数组里,所以我们可以将二维数组转成List再进行排序,List标定的泛型类型是实体类,确保重排的是整行数据。

将二维数组转成List

    public List<PatientInfo> readList(DefaultMutableTreeNode target) {
        DiseaseType node = (DiseaseType)target.getUserObject();
        List<PatientInfo> patientInfoSet = node.getPatientSet();
        return patientInfoSet;
    }

    /**
     * 查询文件,在选中某结点以后查询出所有的患者并建立二维数组(JTable的Model)
     * @param patientInfoSet
     * @return
     */
    public Object[][] showPatients(List<PatientInfo> patientInfoSet) {
        int size = patientInfoSet.size();
        Object[][] tableData = new Object[size][2];
        int i = 0;
        for (PatientInfo patient : patientInfoSet) {
            tableData[i][0] = patient.getId();
            tableData[i][1] = patient.getName();
            i++;
        }
        return tableData;
    }

按照ID排序

        JButton btnNewButton = new JButton("按ID排序");
        btnNewButton.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                controller.quickSortById(list, 0, list.size()-1);
                tableData = controller.showPatients(list);
                //System.out.println(tableData.length);
                tableModel.setDataVector(tableData, tableHeader);
            }
        });
        btnNewButton.setFont(new Font("黑体", Font.BOLD, 15));
        btnNewButton.setBounds(47, 27, 127, 27);
        panel.add(btnNewButton);

前端排序,按照需求不需要在后端修改:

    /**
     * 对查询到的数据进行排序(按照ID)
     * 排序在前端完成,不返回后台
     */
    public void sortById(List<PatientInfo> list) {
        Collections.sort(list, new Comparator<PatientInfo>(){
            /*
             * int compare(PatientInfo p1, PatientInfo p2) 返回一个基本类型的整型,
             * 返回负数表示:p1 小于p2,
             * 返回0 表示:p1和p2相等,
             * 返回正数表示:p1大于p2
             */
            public int compare(PatientInfo p1, PatientInfo p2) {
                //按照Person的ID进行升序排列
                if(p1.getId() > p2.getId()){
                    return 1;
                }
                if(p1.getId() == p2.getId()){
                    return 0;
                }
                return -1;
            }
        });
    }

按照Name排序:

        JButton button = new JButton("按姓名排序");
        button.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                controller.quickSortByName(list, 0, list.size()-1);
                tableData = controller.showPatients(list);
                //System.out.println(tableData.length);
                tableModel.setDataVector(tableData, tableHeader);
            }
        });
        button.setFont(new Font("黑体", Font.BOLD, 15));
        button.setBounds(234, 27, 127, 27);
        panel.add(button);

前端排序,按照需求不需要在后端修改:

    /**
     * 对查询到的数据进行排序(按照名字)
     * 排序在前端完成,不返回后台
     */
    public void sortByName(List<PatientInfo> list) {
        Collections.sort(list, new Comparator<PatientInfo>(){
            /*
             * int compare(PatientInfo p1, PatientInfo p2) 返回一个基本类型的整型,
             * 返回负数表示:p1 小于p2,
             * 返回0 表示:p1和p2相等,
             * 返回正数表示:p1大于p2
             */
            public int compare(PatientInfo p1, PatientInfo p2) {
                return (p1.getName()).compareTo(p2.getName());
            }
        });
    }

下面两个图就是点击两个JButton的效果:
【Java-GUI】对JTable里的元素进行排序_第1张图片
【Java-GUI】对JTable里的元素进行排序_第2张图片
但是内置的排序效率据说不会特别高,我们也可以自己写排序(快排):

    public void quickSortById(List<PatientInfo> list, int low, int high) {
        //start是list的第一位,end是list的最后一位,start和end都是list的下标;
        int start = low;
        int end = high;
        //key作为参考值,取未排序的list第一位key的首字母作为参考
        //下方的算法大体思路,就是拿list的第一位和key比较,排序,
        //key值前都比value小,key值后都比key大
        Integer key = list.get(low).getId();
        while (end > start) {
            //从后往前比较
            //list.get(end).getId()是list最后一个值的ID
            while (end > start && list.get(end).getId() >= key) {
                end--;
            }
            if (list.get(end).getId() <= key) {
                //此时list第一位和最后一位需要调换位置,先将list第一位的值保存起来
                PatientInfo keyStarts = list.get(start);
                //此处调换位置,使用list的set方法,由于第一位放入了最后一个值,
                //所以最后一位需要放入之前的第一位的值
                list.set(start, list.get(end));
                list.set(end, keyStarts);
            }
            //从前往后比较
            while (end > start && list.get(start).getId() <= key) {
                start++;
            }
            if (list.get(start).getId() >= key) {
                // 同理从后往前比较,需要将第一位的值先保存,方便调换
                PatientInfo keyStarts = list.get(start);
                list.set(start, list.get(end));
                list.set(end, keyStarts);
            }
            if (start > low) quickSortById(list, low, start - 1);
            if (end < high) quickSortById(list, end + 1, high);
        }
    }

    public void quickSortByName(List<PatientInfo> list, int low, int high) {
        //start是list的第一位,end是list的最后一位,start和end都是list的下标;
        int start = low;
        int end = high;
        //value作为参考值,取未排序的list第一位key的首字母作为参考
        //下方的算法大体思路,就是拿list的第一位和key比较,排序,
        //key值前都比key小,key值后都比value大
        String key = list.get(low).getName();
        while (end > start) {
            //从后往前比较
            //list.get(end).getId()是list最后一个值的ID
            while (end > start && list.get(end).getName().compareTo(key) >= 0) {
                end--;
            }
            if (list.get(end).getName().compareTo(key) <= 0) {
                //此时list第一位和最后一位需要调换位置,先将list第一位的值保存起来
                PatientInfo keyStarts = list.get(start);
                //此处调换位置,使用list的set方法,由于第一位放入了最后一个值,
                //所以最后一位需要放入之前的第一位的值
                list.set(start, list.get(end));
                list.set(end, keyStarts);
            }
            //从前往后比较
            while (end > start && list.get(end).getName().compareTo(key) <= 0) {
                start++;
            }
            if (list.get(end).getName().compareTo(key) >= 0) {
                // 同理从后往前比较,需要将第一位的值先保存,方便调换
                PatientInfo keyStarts = list.get(start);
                list.set(start, list.get(end));
                list.set(end, keyStarts);
            }
            if (start > low) quickSortByName(list, low, start - 1);
            if (end < high) quickSortByName(list, end + 1, high);
        }
    }

你可能感兴趣的:(#,#,Java-GUI,#)