JTable 合并单元格 简易实现
想用JTABLE做一个报表,目前遇到来问题是表头的合并和单元格合并,同时希望代码实现简单易用
表头合并,网上找了一个例子符合这个要求(https://blog.csdn.net/Beingccccc/article/details/90600940)
但是网上的单元格合并例子,代码复杂,希望能向上面的例子一样简单
自己根据之前的表头合并例子,稍微修改后,实现单元格合并
将之前的ComplexHeaderUI类稍加修改成ComplexTableUI就可以使用了
上效果图
package org.hxb.table;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Rectangle;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.UIManager;
import javax.swing.plaf.basic.BasicTableUI;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableColumnModel;
/**
* 实现表头渲染UI,主要功能时画出表头的单元格
* @author 雷锋
* @Date 2019年5月27日
*/
public class ComplexTableUI extends BasicTableUI {
private Object[][] headerRows;
private JTable table;
private int singleRowHeight;
public ComplexTableUI(Object[][] headerRows,JTable table){
this.headerRows = headerRows;
this.table = table;
//获取单行的高度,不能使用header.getHeight()获取高度,因为此时表头还没初始化完毕,获取出来的高度是0
this.singleRowHeight = table.getRowHeight();
// System.out.println(table.getRowHeight());
JTableHeader tableHeader = table.getTableHeader();
//设置表头不允许拖动 、由于合并了单元格,拖动之后会乱
tableHeader.setReorderingAllowed(false);
//设置表头整体高度、宽度
tableHeader.setPreferredSize(new Dimension(table.getWidth(), singleRowHeight * headerRows.length ));
}
/**
* 重写BasicTableHeaderUI.paint的方法是最重要的部分
*/
@Override
public void paint(Graphics g, JComponent c) {
for( int row = 0 ; row < headerRows.length ; row++ ){
Object[] headerRow = headerRows[row];
for( int col = 0 ; col < headerRow.length ; col++ ){
Object cell = headerRow[col];
//如果单元格为合并类单元格、获取其上方是X合并类单元格 + 左边是Y合并类单元格,那么该单元格不需要在窗口展示
if( cell == ComplexTable.mergeCellX || cell == ComplexTable.mergeCellY || ( col > 0 && row > 0 && headerRow[col - 1] == ComplexTable.mergeCellY && headerRows[row-1][col] == ComplexTable.mergeCellX ) )
continue;
Rectangle rect = this.getCellRect(row, col);
String text = cell == null ? "" : cell.toString();
paintCell(g, rect, text);
}
}
}
/**
* 获取当前单元格需要占多少个单位,比如此时的row+1行col列的值=mergeCell,那么说明当前单元格需要占2行
* @param row
* @param col
* @return
*/
private Rectangle getCellRect(int row , int col){
int mergeRowNum = 1;
int nextRow = row;
//判断出y轴方向合并了几行
while( ++nextRow < headerRows.length ){
Object nextRowCell = headerRows[