下面是核心内容
响应并处理选中的结点:
// 设置节点选中监听器
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 readList(DefaultMutableTreeNode target) {
DiseaseType node = (DiseaseType)target.getUserObject();
List patientInfoSet = node.getPatientSet();
return patientInfoSet;
}
/**
* 查询文件,在选中某结点以后查询出所有的患者并建立二维数组(JTable的Model)
* @param patientInfoSet
* @return
*/
public Object[][] showPatients(List 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 list) {
Collections.sort(list, new Comparator(){
/*
* 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 list) {
Collections.sort(list, new Comparator(){
/*
* 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的效果:
但是内置的排序效率据说不会特别高,我们也可以自己写排序(快排):
public void quickSortById(List 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() start && 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 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) start && 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
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?