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(0, 1);
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(0, 1);
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();
}
本文介绍如何在Java中创建带有纵向表头的JTable,即使不使用JScrollPane也能显示表头。通过自定义RowHeaderTable类和RowHeaderRender渲染器,实现了表格的表头纵向排列效果,方便在桌面应用中模拟web表单的样式。

824

被折叠的 条评论
为什么被折叠?



