当前位置导航:炫浪网>>网络学院>>编程开发>>JAVA教程>>Java进阶

java中如何实现表格的多表头显示


  首先声明,这些内容都是借鉴来的,稍微改动了一下。
  
  主要就是三个应用类ColumnGroup, GroupableTableHeader,GroupableTableHeaderU和一个示例类GroupableHeaderExample
  
  1、ColumnGroup类主要负责多表头的构建
  
  import java.awt.Component;
  import java.awt.Dimension;
  import java.util.Enumeration;
  import java.util.Vector;
  
  import javax.swing.JLabel;
  import javax.swing.JTable;
  import javax.swing.UIManager;
  import javax.swing.table.DefaultTableCellRenderer;
  import javax.swing.table.JTableHeader;
  import javax.swing.table.TableCellRenderer;
  import javax.swing.table.TableColumn;
  
  public class ColumnGroup {
  protected TableCellRenderer renderer;
  
  protected Vector v;
  
  protected String text;
  
  protected int margin = 0;
  
  public ColumnGroup(String text) {
  this(null, text);
  }
  
  public ColumnGroup(TableCellRenderer renderer, String text) {
  if (renderer == null) {
  this.renderer = new DefaultTableCellRenderer() {
  public Component getTableCellRendererComponent(JTable table,
  Object value, boolean isSelected, boolean hasFocus,
  int row, int column) {
  JTableHeader header = table.getTableHeader();
  if (header != null) {
  setForeground(header.getForeground());
  setBackground(header.getBackground());
  setFont(header.getFont());
  }
  setHorizontalAlignment(JLabel.CENTER);
  this.setText((value == null) ? "" : value.toString());
  setBorder(UIManager.getBorder("TableHeader.cellBorder"));
  return this;
  }
  };
  } else {
  this.renderer = renderer;
  }
  this.text = text;
  v = new Vector();
  }
  
  /**
  * @param obj
  *      TableColumn or ColumnGroup
  */
  public void add(Object obj) {
  if (obj == null) {
  return;
  }
  v.addElement(obj);
  }
  
  /**
  * @param c
  *      TableColumn
  * @param v
  *      ColumnGroups
  */
  public Vector getColumnGroups(TableColumn c, Vector g) {
  g.addElement(this);
  if (v.contains(c))
  return g;
  Enumeration enumeration = v.elements();
  while (enumeration.hasMoreElements()) {
  Object obj = enumeration.nextElement();
  if (obj instanceof ColumnGroup) {
  Vector groups = (Vector) ((ColumnGroup) obj).getColumnGroups(c,
  (Vector) g.clone());
  if (groups != null)
  return groups;
  }
  }
  return null;
  }
  
  public TableCellRenderer getHeaderRenderer() {
  return renderer;
  }
  
  public Object getHeaderValue() {
  return text;
  }
  
  public int getSize() {
  return v == null ? 0 : v.size();
  }
  
  public Dimension getSize(JTable table) {
  Component comp = renderer.getTableCellRendererComponent(table,
  getHeaderValue(), false, false, -1, -1);
  int height = comp.getPreferredSize().height;
  int width = 0;
  Enumeration enumeration = v.elements();
  while (enumeration.hasMoreElements()) {
  Object obj = enumeration.nextElement();
  if (obj instanceof TableColumn) {
  TableColumn aColumn = (TableColumn) obj;
  width += aColumn.getWidth();
  width += margin;
  } else {
  width += ((ColumnGroup) obj).getSize(table).width;
  }
  }
  return new Dimension(width, height);
  }
  
  /**
  *
  * 创建日期:(2003-7-14 10:53:26)
  *
  * @return java.lang.String
  */
  public java.lang.String getText() {
  return text;
  }
  
  /**
  * 列表头中删除Column 创建日期:(2002-9-25 15:49:00)
  */
  public boolean removeColumn(ColumnGroup ptg, TableColumn tc) {
  boolean retFlag = false;
  if (tc != null) {
  for (int i = 0; i < ptg.v.size(); i++) {
  Object tmpObj = ptg.v.get(i);
  if (tmpObj instanceof ColumnGroup) {
  retFlag = removeColumn((ColumnGroup) tmpObj, tc);
  // 如果找到返回
  if (retFlag)
  break;
  } else if (tmpObj instanceof TableColumn) {
  // 判断是否查找的对象
  if (tmpObj == tc) {
  ptg.v.remove(i);
  retFlag = true;
  break;
  }
  }
  }
  }
  return retFlag;
  }
  
  /**
  * 列表头中删除ColumnGrp 删除返回true,否则返回false; 创建日期:(2002-9-25 15:49:00)
  */
  public boolean removeColumnGrp(ColumnGroup ptg, ColumnGroup tg) {
  boolean retFlag = false;
  if (tg != null) {
  for (int i = 0; i < ptg.v.size(); i++) {
  Object tmpObj = ptg.v.get(i);
  if (tmpObj instanceof ColumnGroup) {
  // 判断是否查找的对象
  if (tmpObj == tg) {
  ptg.v.remove(i);
  retFlag = true;
  break;
  } else {
  retFlag = removeColumnGrp((ColumnGroup) tmpObj, tg);
  // 如果找到返回
  if (retFlag)
  break;
  
  }
  } else if (tmpObj instanceof TableColumn) {
  break;
  }
  }
  }
  return retFlag;
  }
  
  public void setColumnMargin(int margin) {
  this.margin = margin;
  Enumeration enumeration = v.elements();
  while (enumeration.hasMoreElements()) {
  Object obj = enumeration.nextElement();
  if (obj instanceof ColumnGroup) {
  ((ColumnGroup) obj).setColumnMargin(margin);
  }
  }
  }
  
  public void setHeaderRenderer(TableCellRenderer renderer) {
  if (renderer != null) {
  this.renderer = renderer;
  }
  }
  
  /**
  *
  * 创建日期:(2003-7-14 10:53:26)
  *
  * @param newText
  *      java.lang.String
  */
  public void setText(java.lang.String newText) {
  text = newText;
  }
  }
  
  2、GroupableHeader继承自JTableHeader,为多表头结构的管理者
  
  import java.util.Enumeration;
  import java.util.Vector;
  
  import javax.swing.table.JTableHeader;
  import javax.swing.table.TableColumn;
  import javax.swing.table.TableColumnModel;
  
  
  /**
  * GroupableTableHeader
  * @author flyx
  */
  
  public class GroupableTableHeader extends JTableHeader {
  private static final String uiClassID = "GroupableTableHeaderUI";
  protected Vector columnGroups = null;
  public GroupableTableHeader(TableColumnModel model) {
  super(model);
  setUI(new GroupableTableHeaderUI());
  setReorderingAllowed(false);
  setRequestFocusEnabled(false);
  }
  public void addColumnGroup(ColumnGroup g) {
  if (columnGroups == null) {
  columnGroups = new Vector();
  }
  columnGroups.addElement(g);
  }
  /**
  *
  * 创建日期:(2001-8-31 15:54:29)
  */
  public void clearColumnGroups() {
  columnGroups = null;
  }
  public ColumnGroup[] getColumnGroups() {
  ColumnGroup[] retg=null;
  if (columnGroups.size()>0) {
  retg=new ColumnGroup[columnGroups.size()];
  columnGroups.copyInto(retg);
  }
  return retg;
  }
  public Enumeration getColumnGroups(TableColumn col) {
  if (columnGroups == null)
  return null;
  Enumeration enum = columnGroups.elements();
  while (enum.hasMoreElements()) {
  ColumnGroup cGroup = (ColumnGroup) enum.nextElement();
  Vector v_ret = (Vector) cGroup.getColumnGroups(col, new Vector());
  if (v_ret != null) {
  return v_ret.elements();
  }
  }
  return null;
  }
  /**
  * Identifies whether or not this component can receive the focus.
  * A disabled button, for example, would return false.
相关内容
赞助商链接