1. package org.jr.swing.table;
  2. /**
  3. * Copyright: Copyright (c) 2002-2004
  4. * Company: JavaResearch(http://www.javaresearch.org)
  5. * 最后更新日期:2003年3月9日
  6. * @author Cherami
  7. */
  8. import org.jr.*;
  9. import org.jr.util.*;
  10. /**
  11. * 使用SortableTableLineData作为数据的表格模型。
  12. * 相对其父类LineDataTableModel,这个类新增的特性就是根据列名排序,
  13. * 而排序方式已经由SortableTableLineData的compareTo方法指定了。
  14. * @since 0.5
  15. */
  16. public class SortableLineDataTableModel
  17. extends LineDataTableModel {
  18. protected int[] indexes;
  19. protected int sortColumn = -1;
  20. protected boolean isAscent;
  21. /**
  22. * 根据指定的列头构造一个SortableLineDataTableModel。
  23. * @param columnNames 列头的名字
  24. * @since 0.5
  25. */
  26. public SortableLineDataTableModel(String[] columnNames) {
  27. super(columnNames);
  28. indexes = ArrayUtil.getInitedIntArray(0);
  29. }
  30. /**
  31. * 根据指定的初始数据构造一个SortableLineDataTableModel。
  32. * @param columnNames 列头名称
  33. * @param data 初始数据
  34. * @since 0.5
  35. */
  36. public SortableLineDataTableModel(String[] columnNames, TableLineData[] data) {
  37. super(columnNames, data);
  38. indexes = ArrayUtil.getInitedIntArray(data.length);
  39. }
  40. /**
  41. * 根据指定的列名和顺序排序。
  42. * @param column 排序的列
  43. * @param isAscent 排序顺序
  44. * @since 0.5
  45. */
  46. public void sortByColumn(int column, boolean isAscent) {
  47. sortColumn = column;
  48. this.isAscent = isAscent;
  49. sort();
  50. fireTableDataChanged();
  51. }
  52. /**
  53. * 排序设置排序后的索引
  54. * @since 0.5
  55. */
  56. protected void sort() {
  57. if (sortColumn >= 0 && sortColumn < columnCount) {
  58. indexes = CompareUtil.n2sort( (PropertyComparable[]) data.toArray(new
  59. PropertyComparable[0]), sortColumn, isAscent);
  60. }
  61. else {
  62. indexes = ArrayUtil.getInitedIntArray(data.size());
  63. }
  64. }
  65. /**
  66. * 得到排序列的列名
  67. * @return 排序列的列名
  68. * @since 0.5
  69. */
  70. public int getSortColumn() {
  71. return sortColumn;
  72. }
  73. /**
  74. * 得到排序顺序
  75. * @return 顺序的时候返回true,否则返回false
  76. * @since 0.5
  77. */
  78. public boolean getSortOrder() {
  79. return isAscent;
  80. }
  81. /**
  82. * 清除排序状态回到未排序状态。
  83. * @since 0.5
  84. */
  85. public void clearSort() {
  86. indexes = ArrayUtil.getInitedIntArray(columnCount);
  87. sortColumn = -1;
  88. fireTableDataChanged();
  89. }
  90. /**
  91. * 得到排序后的表格单元的值。
  92. * @param row 行
  93. * @param col 列
  94. * @return 得到排序后的表格单元的值。
  95. * @since 0.5
  96. */
  97. public Object getValueAt(int row, int col) {
  98. Object object = super.getValueAt(indexes[row], col);
  99. return object;
  100. }
  101. /**
  102. * 设置表格单元的值。
  103. * @param value 表格单元的值
  104. * @param row 行
  105. * @param col 列
  106. * @since 0.5
  107. */
  108. public void setValueAt(Object value, int row, int col) {
  109. super.setValueAt(value, indexes[row], col);
  110. }
  111. /**
  112. * 得到排序后的索引数组。
  113. * @return 排序后的索引数组,如果没有排过序得到的就是初始数组。
  114. * @since 0.5
  115. */
  116. public int[] getIndexes() {
  117. return indexes;
  118. }
  119. /**
  120. * 增加一行数据到模型的最后。
  121. * @param rowData 一行数据
  122. * @since 0.5
  123. */
  124. public void addRow(TableLineData rowData) {
  125. data.add(rowData);
  126. sort();
  127. fireTableDataChanged();
  128. }
  129. /**
  130. * 添加多行数据到模型的最后。
  131. * @param data 多行数据
  132. * @since 0.5
  133. */
  134. public void addRows(TableLineData[] data) {
  135. ListUtil.addArrayToList(data, this.data);
  136. sort();
  137. fireTableDataChanged();
  138. }
  139. /**
  140. * 删除指定行。
  141. * @param row 行号
  142. * @since 0.5
  143. */
  144. public void removeRow(int row) {
  145. TableLineData removedRow = (TableLineData) data.remove(row);
  146. fireTableRowsDeleted(row, row);
  147. }
  148. }