响应并处理选中的结点:
// 设置节点选中监听器
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的效果:
但是内置的排序效率据说不会特别高,我们也可以自己写排序(快排):
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);
}
}