表头合并单元格. JTable Groupable TableHeader

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

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

/**
 * 列头组
 * 
 * 
@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());
    }


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

    
pu
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
JTable合并单元格需要重写 TableCellRenderer 和 TableCellEditor 接口,以自定义单元格绘制和编辑。以下是一个简单的例子,可以将第一行和第二行第一列的单元格合并: ``` import java.awt.Component; import javax.swing.JFrame; import javax.swing.JScrollPane; import javax.swing.JTable; import javax.swing.table.DefaultTableCellRenderer; import javax.swing.table.DefaultTableModel; import javax.swing.table.TableCellEditor; import javax.swing.table.TableCellRenderer; public class MergeCellTable extends JFrame { private static final long serialVersionUID = 1L; private JTable table; public MergeCellTable() { setTitle("Merge Cell Table"); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setSize(300, 200); DefaultTableModel model = new DefaultTableModel() { private static final long serialVersionUID = 1L; @Override public boolean isCellEditable(int row, int column) { return false; } }; model.addColumn("Column 1"); model.addColumn("Column 2"); model.addColumn("Column 3"); model.addColumn("Column 4"); model.addRow(new Object[] { "Row 1, Column 1", "Row 1, Column 2", "Row 1, Column 3", "Row 1, Column 4" }); model.addRow(new Object[] { "Row 2, Column 1", "Row 2, Column 2", "Row 2, Column 3", "Row 2, Column 4" }); model.addRow(new Object[] { "Row 3, Column 1", "Row 3, Column 2", "Row 3, Column 3", "Row 3, Column 4" }); table = new JTable(model); table.setRowHeight(20); table.getColumnModel().getColumn(0).setCellRenderer(new MergeCellRenderer()); table.getColumnModel().getColumn(0).setCellEditor(new MergeCellEditor()); JScrollPane scroll = new JScrollPane(table); getContentPane().add(scroll); setVisible(true); } public static void main(String[] args) { new MergeCellTable(); } private class MergeCellRenderer extends DefaultTableCellRenderer implements TableCellRenderer { private static final long serialVersionUID = 1L; public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) { if (row == 0 || row == 1 && column == 0) { setText((String) value); setHorizontalAlignment(CENTER); setVerticalAlignment(CENTER); setOpaque(true); setBackground(table.getBackground()); } else { setText((String) value); setHorizontalAlignment(LEFT); setVerticalAlignment(CENTER); setOpaque(true); setBackground(table.getBackground()); } return this; } } private class MergeCellEditor extends DefaultTableCellRenderer implements TableCellEditor { private static final long serialVersionUID = 1L; public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) { return getTableCellRendererComponent(table, value, isSelected, false, row, column); } public Object getCellEditorValue() { return getText(); } public boolean isCellEditable(java.util.EventObject e) { return true; } public boolean shouldSelectCell(java.util.EventObject anEvent) { return true; } public boolean stopCellEditing() { return true; } public void cancelCellEditing() { } public void addCellEditorListener(javax.swing.event.CellEditorListener l) { } public void removeCellEditorListener(javax.swing.event.CellEditorListener l) { } } } ``` 这个例子只是演示了一种简单的合并单元格的方法,更复杂的需求需要更复杂的实现方式。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值