1. package org.jr.swing.table;
  2. /**
  3. * Copyright: Copyright (c) 2002-2004
  4. * Company: JavaResearch(http://www.javaresearch.org)
  5. * 最后更新日期:2003年3月14日
  6. * @author Cherami
  7. */
  8. import java.util.*;
  9. import javax.swing.table.*;
  10. import org.jr.util.*;
  11. /**
  12. * 使用TableLineData作为数据的表格模型。
  13. * 根据TableLineData的特性,表格是不能新增列的,但是表格的某一列是可以完全隐藏的,包括其表格头。
  14. * @since 0.5
  15. */
  16. public class LineDataTableModel
  17. extends AbstractTableModel {
  18. protected ArrayList data;
  19. protected int columnCount;
  20. protected ArrayList columnNames;
  21. protected int[] columnIndexes;
  22. protected String[] originalColumnNames;
  23. protected boolean[] status;
  24. protected int hiddenColumnCount;
  25. /**
  26. * 根据指定的列头构造一个LineDataTableModel。
  27. * @param columnNames 列头的名字
  28. * @since 0.5
  29. */
  30. public LineDataTableModel(String[] columnNames) {
  31. this.columnNames = (ArrayList)Arrays.asList(columnNames);
  32. originalColumnNames = columnNames;
  33. if (this.columnNames == null) {
  34. this.columnNames = new ArrayList(10);
  35. originalColumnNames = new String[0];
  36. }
  37. columnCount = this.columnNames.size();
  38. status = ArrayUtil.getInitedBooleanArray(columnCount, true);
  39. data = new ArrayList(10);
  40. columnIndexes = ArrayUtil.getInitedIntArray(columnCount);
  41. }
  42. /**
  43. * 根据指定的初始数据构造一个LineDataTableModel。
  44. * @param columnNames 列头名字
  45. * @param data 初始数据
  46. * @since 0.5
  47. */
  48. public LineDataTableModel(String[] columnNames, TableLineData[] data) {
  49. //TOTHINK 同质类型的判断及处理?
  50. this(columnNames);
  51. ListUtil.addArrayToList(data, this.data);
  52. }
  53. /**
  54. * 得到表格单元的值。
  55. * @param row 行
  56. * @param col 列
  57. * @return 得到排序后的表格单元的值。
  58. * @since 0.5
  59. */
  60. public Object getValueAt(int row, int col) {
  61. return ( (TableLineData) (data.get(row))).get(columnIndexes[col]);
  62. }
  63. /**
  64. * 设置表格单元的值。
  65. * @param value 表格单元的值
  66. * @param row 行
  67. * @param col 列
  68. * @since 0.5
  69. */
  70. public void setValueAt(Object value, int row, int col) {
  71. ( (TableLineData) (data.get(row))).set(columnIndexes[col], value);
  72. }
  73. /**
  74. * 得到表格模型中的数据的行数。
  75. * @return 表格模型中的数据的行数
  76. * @since 0.5
  77. */
  78. public int getRowCount() {
  79. if (data != null) {
  80. return data.size();
  81. }
  82. else {
  83. return 0;
  84. }
  85. }
  86. /**
  87. * 得到表格模型中的可见列的列数
  88. * @return 可见列的列数
  89. * @since 0.5
  90. */
  91. public int getColumnCount() {
  92. return columnCount;
  93. }
  94. /**
  95. * 得到指定列的列名,可见列。
  96. * @param column 列
  97. * @return 对应的列名
  98. * @since 0.5
  99. */
  100. public String getColumnName(int column) {
  101. return (String) columnNames.get(column);
  102. }
  103. /**
  104. * 增加一行数据到模型的最后。
  105. * @param rowData 一行数据
  106. * @since 0.5
  107. */
  108. public void addRow(TableLineData rowData) {
  109. data.add(rowData);
  110. fireTableRowsInserted(data.size(), data.size());
  111. }
  112. /**
  113. * 插入一行数据到指定行。
  114. * @param row 行数
  115. * @param rowData 一行数据
  116. * @since 0.5
  117. */
  118. public void insertRow(int row, TableLineData rowData) {
  119. data.add(row, rowData);
  120. fireTableRowsInserted(row, row);
  121. }
  122. /**
  123. * 添加多行数据到模型的最后。
  124. * @param data 多行数据
  125. * @since 0.5
  126. */
  127. public void addRows(TableLineData[] data) {
  128. ListUtil.addArrayToList(data, this.data);
  129. fireTableRowsInserted(this.data.size() - data.length, this.data.size());
  130. }
  131. /**
  132. * 插入多行数据到指定行。
  133. * @param row 行号
  134. * @param data 多行数据
  135. * @since 0.5
  136. */
  137. public void insertRows(int row, TableLineData[] data) {
  138. ListUtil.addArrayToList(data, this.data, row);
  139. fireTableRowsInserted(row, row + data.length);
  140. }
  141. /**
  142. * 删除指定行。
  143. * @param row 行号
  144. * @since 0.5
  145. */
  146. public void removeRow(int row) {
  147. TableLineData removedRow = (TableLineData) data.remove(row);
  148. fireTableRowsDeleted(row, row);
  149. }
  150. /**
  151. * 清除所有数据。
  152. * @since 0.5
  153. */
  154. public void clear() {
  155. data.clear();
  156. fireTableDataChanged();
  157. }
  158. /**
  159. * 将指定行的内容移动到指定位置。
  160. * @param start 开始行
  161. * @param end 结束行
  162. * @param to 移动到的行号
  163. * @since 0.5
  164. */
  165. public void moveRows(int start, int end, int to) {
  166. if (to != start) {
  167. ListUtil.moveElements(data, start, end, to);
  168. fireTableDataChanged();
  169. }
  170. }
  171. /**
  172. * 设置某一列的可见性。
  173. * 这里的列是指初始化时原始的列的序号。
  174. * 如果状态和原来相同则不会进行任何操作。
  175. * @param column 列
  176. * @param visible 可见性
  177. * @since 0.5
  178. */
  179. public void setVisible(int column, boolean visible) {
  180. if (column > 0 && column < columnCount && status[column] != visible) {
  181. if (visible == true) {
  182. showColumn(column);
  183. fireTableStructureChanged();
  184. }
  185. else if (visible == false) {
  186. hiddenColumn(column);
  187. fireTableStructureChanged();
  188. }
  189. }
  190. }
  191. /**
  192. * 设置指定列的状态为隐藏。
  193. * @param column 列
  194. */
  195. private void hiddenColumn(int column) {
  196. status[column] = false;
  197. columnNames.remove(originalColumnNames[column]);
  198. ArrayUtil.shiftArray(columnIndexes, column - hiddenColumnCount);
  199. columnCount--;
  200. hiddenColumnCount++;
  201. }
  202. /**
  203. * 设置指定列的状态为显示。
  204. * @param column 列
  205. */
  206. private void showColumn(int column) {
  207. hiddenColumnCount--;
  208. status[column] = true;
  209. columnNames.add(column, originalColumnNames[column]);
  210. ArrayUtil.insertValueToArray(columnIndexes, column, column);
  211. columnCount++;
  212. }
  213. /**
  214. * 得到所有被隐藏的列的列名。
  215. * @return 被隐藏的列的列名数组
  216. * @since 0.5
  217. */
  218. public String[] getHiddenColumns() {
  219. int length = originalColumnNames.length;
  220. int index = 0;
  221. String[] hiddenColumns = new String[length - columnCount];
  222. for (int i = 0; i < length; i++) {
  223. if (status[i] == false) {
  224. hiddenColumns[index] = originalColumnNames[i];
  225. index++;
  226. }
  227. }
  228. return hiddenColumns;
  229. }
  230. /**
  231. * 设置列的显示状态。
  232. * 如果该位的值为1则表示显示该列,否则不显示。
  233. * 由于长整型数的长度限制,这个方法只能对64列以内的列进行控制。
  234. * 例如status为5则表示显示最初的第一列和第三列,其他的都不显示。
  235. * @param status 如果由低到高的位为0则该列不显示,否则显示。
  236. * @since 0.5
  237. */
  238. public void setVisibleStatus(long status) {
  239. long value = 1;
  240. boolean haveChanged = false;
  241. for (int i = 0; i < columnCount; i++) {
  242. if ( (value & status) != 0 && this.status[i] == false) {
  243. showColumn(i);
  244. haveChanged = true;
  245. }
  246. else if ( (value & status) == 0 && this.status[i] == true) {
  247. hiddenColumn(i);
  248. haveChanged = true;
  249. }
  250. value = value << 1;
  251. }
  252. if (haveChanged == true) {
  253. fireTableStructureChanged();
  254. }
  255. }
  256. /**
  257. * 设置列的显示状态。
  258. * 如果boolean数组的对应的元素的值为true则显示该列,否则不显示。
  259. * @param status 状态数组。
  260. * @since 0.5
  261. */
  262. public void setVisibleStatus(boolean[] status) {
  263. boolean haveChanged = false;
  264. int length = Math.min(status.length, this.status.length);
  265. for (int i = 0; i < length; i++) {
  266. if (status[i] != this.status[i]) {
  267. if (status[i] == true) {
  268. showColumn(i);
  269. }
  270. else {
  271. hiddenColumn(i);
  272. }
  273. haveChanged = true;
  274. }
  275. }
  276. if (haveChanged == true) {
  277. fireTableStructureChanged();
  278. }
  279. }
  280. public int getRealIndex(int column) {
  281. return columnIndexes[column];
  282. }
  283. }