表头合并单元格. JTable Groupable TableHeader

本文介绍如何在Java中实现JTable的表头合并功能。通过定义接口和实现类,详细展示了表头合并的逻辑,包括每个Cell的位置、行列占据情况及文字设置。并提供了重写后的表头组件和UI部分的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

表头合并单元格. 照例不多说了, 看代码吧.

首先需要定义一个接口, 看看表头是怎么合并的

/**
 * 列头组
 * 
 * 
@author Brad.Wu
 * 
@version 1.0
 
*/

public   interface  Group  {
    
/**
     * 获取所在行
     * 
     * 
@return
     
*/

    
public int getRow();

    
/**
     * 获取所在列
     * 
     * 
@return
     
*/

    
public int getColumn();

    
/**
     * 获取占列个数
     * 
     * 
@return
     
*/

    
public int getColumnSpan();

    
/**
     * 获取占行个数
     * 
     * 
@return
     
*/

    
public int getRowSpan();

    
/**
     * 获取文字
     * 
     * 
@return
     
*/

    
public Object getHeaderValue();
}

 这个和HTML的写法其实一样的. 主要就是每个Cell所在的位置, 占的行列数以及文字.

接下来是一个默认的实现. 其实不写接口也可以, 因为通常不会对表头做动作的.

 

/**
 * 默认Group实现
 * 
 * 
@author Brad.Wu
 * 
@version 1.0
 
*/

public   class  DefaultGroup  implements  Group  {
    
private int row = 0;

    
private int column = 0;

    
private int rowSpan = 1;

    
private int columnSpan = 1;

    
private Object headerValue = null;

    
/*
     * (非 Javadoc)
     * 
     * @see com.eplat.realty.view.component.table.Group#getRow()
     
*/

    
public int getRow() {
        
return this.row;
    }


    
/**
     * 
@param row 要设置的 row。
     
*/

    
public void setRow(int row) {
        
this.row = row;
    }


    
/*
     * (非 Javadoc)
     * 
     * @see com.eplat.realty.view.component.table.Group#getColumn()
     
*/

    
public int getColumn() {
        
return this.column;
    }


    
/**
     * 
@param column 要设置的 column。
     
*/

    
public void setColumn(int column) {
        
this.column = column;
    }


    
/*
     * (非 Javadoc)
     * 
     * @see com.eplat.realty.view.component.table.Group#getColumnSpan()
     
*/

    
public int getColumnSpan() {
        
return this.columnSpan;
    }


    
/**
     * 
@param columnSpan 要设置的 columnSpan。
     
*/

    
public void setColumnSpan(int columnSpan) {
        
this.columnSpan = columnSpan;
    }


    
/*
     * (非 Javadoc)
     * 
     * @see com.eplat.realty.view.component.table.Group#getRowSpan()
     
*/

    
public int getRowSpan() {
        
return this.rowSpan;
    }


    
/**
     * 
@param rowSpan 要设置的 rowSpan。
     
*/

    
public void setRowSpan(int rowSpan) {
        
this.rowSpan = rowSpan;
    }


    
/*
     * (非 Javadoc)
     * 
     * @see com.eplat.realty.view.component.table.Group#getHeaderValue()
     
*/

    
public Object getHeaderValue() {
        
return this.headerValue;
    }


    
/**
     * 
@param headerValue 要设置的 headerValue。
     
*/

    
public void setHeaderValue(Object headerValue) {
        
this.headerValue = headerValue;
    }

}

 

重写一个表头组件

 

import  java.awt.Component;
import  java.awt.Rectangle;
import  java.util.ArrayList;
import  java.util.List;

import  javax.swing.JTable;
import  javax.swing.table.JTableHeader;
import  javax.swing.table.TableCellRenderer;
import  javax.swing.table.TableColumnModel;

/**
 * 可以合并的列头
 * 
 * 
@author Brad.Wu
 * 
@version 1.0
 
*/

@SuppressWarnings(
" serial " )
public   class  GroupableTableHeader  extends  JTableHeader  {
    
private int rowCount = 0;

    
private int columnCount = 0;

    
private List<Group> groups = new ArrayList<Group>();

    
public GroupableTableHeader() {
                                           
// 这个是必须的, 因为如果可以拖动列的位置, 那么一切都完蛋了.
                                           
// 如果你想实现这个功能, 那么只能你自己去做了, 我可不想做这个, 看上去超烦的
        this.setReorderingAllowed(false);
    }


    
/*
     * (非 Javadoc)
     * 
     * @see javax.swing.table.JTableHeader#updateUI()
     
*/

    @Override
    
public void updateUI() {
        setUI(
new GroupableTableHeaderUI());
    }


    
/*
     * 获取指定行列的位置
     
*/

    
public Rectangle getHeaderRect(int row, int column) {
        Rectangle r 
= new Rectangle();
        TableColumnModel cm 
= getColumnModel();

        Group group 
= this.getGroup(row, column);
        r.height 
= getHeight();

        
if (colu
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值