JTable纵向表头,JTable表头纵向排列

本文介绍如何在Java中创建带有纵向表头的JTable,即使不使用JScrollPane也能显示表头。通过自定义RowHeaderTable类和RowHeaderRender渲染器,实现了表格的表头纵向排列效果,方便在桌面应用中模拟web表单的样式。
 1、JTable通常要加到JScrollPane中才能显示带滚动条的表格,如果不加到JScrollPane中,默认不显示表头, 下面的方法可以让不在JScrollPane中的表格显示表头 container.setLayout(new BorderLayout()); container.add(table.getTableHeader(), BorderLayout.PAGE_START); container.add(table, BorderLayout.CENTER);
 
2、加在JScrollPane中的表格,表头在上部,JTable不支持表头纵向排列,在web页面form表单中经常用标签文本框的格式,在JTable中实现这个效果比较麻烦。下面的两个类可以实现表格的表头纵向排列的效果 RowHeaderTable用来创建带纵向表头的表格,用法类似JTable,不过没有继承JTable, getScrollPane()方法可以得到带JScrollPane的表格,不需要把生成的表格对象重新加到JScrollPane getScrollPane()得到的JScrollPane其实是由两个表格组成的,一个是纵向排列的表头(此处主要用到了JScrollPane的setRowHeaderView()方法),另一个是存储数据的表格
 
RowHeaderRender是纵向表头的绘制器,以此来设置纵向表头的显示效果
 
 
//表格生成类 import java.awt.Color; import java.awt.Dimension; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.table.DefaultTableModel; public class RowHeaderTable...{          private JTable dataTable;     private JTable headerTable;     private DefaultTableModel dataTableModel;     private DefaultTableModel headerTableModel;          public void setRowHeader(Object[] rowHeader)...{         if(headerTableModel == null)...{             headerTableModel = new DefaultTableModel(01);             headerTable = new JTable(headerTableModel);                          headerTable.setEnabled(false);             headerTable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);             headerTable.getColumnModel().getColumn(0).setPreferredWidth(500);             headerTable.setPreferredScrollableViewportSize(                       new Dimension(headerTable.getColumnModel().getColumn(0).getPreferredWidth(), 6)             );         }         headerTableModel.setRowCount(rowHeader.length);         /* 为rowHeaderTable设置预设的绘制器 */         headerTable.setDefaultRenderer(headerTable.getColumnClass(0), new RowHeaderRender(rowHeader));     }          public void addRow(Object[] values)...{         if(dataTableModel == null)...{             Object[] header = ...{"对应值"};             dataTableModel = new DefaultTableModel(01);             dataTableModel.setColumnIdentifiers(header);                          dataTable = new JTable(dataTableModel);         }                  //把横列转为纵列         for(int i=0; i<values.length; i++)...{             Object[] value = ...{values[i]};             dataTableModel.addRow(value);             }             }          public void removeAllRow()...{         if(dataTableModel != null)...{             dataTableModel.setRowCount(0);         }             }          public DefaultTableModel getModel()...{         return dataTableModel;     }          public void stopCellEditing()...{         if(dataTable.getCellEditor() != null)...{             dataTable.getCellEditor().stopCellEditing();         }     }            public JScrollPane getScrollPane()...{         /* 将table加入JScrollPane */                 JScrollPane scrollPane = new JScrollPane(dataTable);         scrollPane.setRowHeaderView(headerTable);         scrollPane.getRowHeader().setBackground(Color.WHITE);         scrollPane.getViewport().setBackground(Color.WHITE);         return scrollPane;     } }
 
//表格纵向表头绘制器 import java.awt.Color; import java.awt.Component; import java.awt.Font; import javax.swing.JLabel; import javax.swing.JTable; import javax.swing.table.DefaultTableModel; import javax.swing.table.JTableHeader; import javax.swing.table.TableCellRenderer; public class RowHeaderRender extends JLabel implements TableCellRenderer {          private static final JTableHeader header =(new JTable()).getTableHeader();      private static final Color BACKGOURND = header.getBackground();     private static final Font FONT = header.getFont();     private Object[] rowHeader;     private int rowCount;          public RowHeaderRender(Object[] rowHeader) {         this.rowHeader = rowHeader;         this.rowCount = rowHeader.length;     }          public Component getTableCellRendererComponent(JTable table, Object obj,             boolean isselected, boolean hasfocus, int row, int col) {         ((DefaultTableModel) table.getModel()).setRowCount(rowCount);                  this.setOpaque(true);                  /* 设为tableHeader的边框类型 */         //        setBorder(UIManager.getBorder("TableHeader.cellBorder"));         setHorizontalAlignment(RIGHT); //        setCellEditor(new DefaultTable);         /* 设置背景色为tableHeader的背景色 */         setBackground(BACKGOURND);         setFont(FONT);         setText(rowHeader[row].toString());         return this;     } }
 
//客户端生成表格
public JScrollPane getTableScrollPane()...{     if(rowHeaderTable == null)...{         rowHeaderTable = new RowHeaderTable();     }     rowHeaderTable.setRowHeader(Object[] columnNames);     rowHeaderTable.removeAllRow();     rowHeaderTable.addRow(Object[] rowData);     return rowHeaderTable.getScrollPane(); }
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值