JTable 合并单元格 简易实现

JTable 合并单元格 简易实现

想用JTABLE做一个报表,目前遇到来问题是表头的合并和单元格合并,同时希望代码实现简单易用
表头合并,网上找了一个例子符合这个要求(https://blog.csdn.net/Beingccccc/article/details/90600940)
但是网上的单元格合并例子,代码复杂,希望能向上面的例子一样简单
自己根据之前的表头合并例子,稍微修改后,实现单元格合并

将之前的ComplexHeaderUI类稍加修改成ComplexTableUI就可以使用了

上效果图
Alt


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[
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值