1. package org.jr.swing.table;
  2. /**
  3. * Copyright: Copyright (c) 2002-2004
  4. * Company: JavaResearch(http://www.javaresearch.org)
  5. * 最后更新日期:2003年3月4日
  6. * @author Cherami
  7. */
  8. import java.awt.*;
  9. import javax.swing.*;
  10. import javax.swing.plaf.basic.*;
  11. import javax.swing.table.*;
  12. /**
  13. * 带排序状态显示的表格头渲染器。
  14. * @since 0.5
  15. */
  16. public class SortableColumnHeaderRenderer
  17. implements TableCellRenderer {
  18. TableCellRenderer render; //内部渲染器
  19. JPanel panel; //内部面板
  20. SortableLineDataTableModel model; //表格模型
  21. /**
  22. * 构造方法,根据表格模型和指定的初始渲染器构造自己的渲染效果。
  23. * @param model 表格模型
  24. * @param render 初始渲染器
  25. */
  26. public SortableColumnHeaderRenderer(SortableLineDataTableModel model,
  27. TableCellRenderer render) {
  28. this.model = model;
  29. this.render = render;
  30. }
  31. /**
  32. * 构造方法,根据表格模型自己的渲染效果。
  33. * @param model 表格模型
  34. */
  35. public SortableColumnHeaderRenderer(SortableLineDataTableModel model) {
  36. this(model, null);
  37. }
  38. /**
  39. * 经过渲染后的组件。
  40. * @param table 需要进行渲染的表格
  41. * @param value 渲染单元的值
  42. * @param isSelected 是否被选中
  43. * @param hasFocus 是否获得焦点
  44. * @param row 需要进行选择的行号
  45. * @param column 需要进行渲染的列号
  46. * @return 经过渲染后的组件
  47. */
  48. public Component getTableCellRendererComponent(JTable table, Object value,
  49. boolean isSelected,
  50. boolean hasFocus, int row,
  51. int column) {
  52. panel = new JPanel();
  53. panel.setLayout(new BorderLayout());
  54. Component component;
  55. if (render != null) {
  56. component = render.getTableCellRendererComponent(table, value,
  57. isSelected, hasFocus, row, column);
  58. }
  59. else {
  60. component = new JLabel( (String) value, JLabel.CENTER);
  61. LookAndFeel.installColorsAndFont( (JComponent) component,
  62. "TableHeader.background",
  63. "TableHeader.foreground",
  64. "TableHeader.font");
  65. }
  66. establishComponent(component, column);
  67. return panel;
  68. }
  69. /**
  70. * 经过渲染后的组件。
  71. * @param component 原来未经渲染的组件
  72. * @param column 需要渲染的列号
  73. */
  74. private void establishComponent(Component component, int column) {
  75. panel.add(component, BorderLayout.CENTER);
  76. if (column == model.sortColumn) {
  77. BasicArrowButton arrowButton = new BasicArrowButton( (model.isAscent ?
  78. SwingConstants.NORTH : SwingConstants.SOUTH));
  79. panel.add(arrowButton, BorderLayout.EAST);
  80. }
  81. }
  82. }