Mesclar células no JTable

Olá

Estou precisando meslcar célular no JTable… segue um modelo de como estou querendo

Vi alguns exemplos, mais não entendi direito


Esse é o código do meu AbstractTableModel

[code]public class clsDadosIniciaisTM extends AbstractTableModel{

private List<clsDadosIniciaisCol> linhas;
//private String[] cColunas = new String[]{"ID", "Código", "Razão Social", "Fantasia", "Telefone", "Contato"};
private String[] cColunas;

public clsDadosIniciaisTM(String[] cColunas) {
    linhas = new ArrayList<clsDadosIniciaisCol>();
    this.cColunas = cColunas;
}

public clsDadosIniciaisTM(List<clsDadosIniciaisCol> listaDadosIniciais) {
    linhas = new ArrayList<clsDadosIniciaisCol>(listaDadosIniciais);
}

@Override
public int getColumnCount() {
    return cColunas.length;
}

@Override
public int getRowCount() {
    return linhas.size();
}

@Override
public String getColumnName(int columnIndex) {
    return cColunas[columnIndex];
}

@Override
public Class<?> getColumnClass(int columnIndex) {

    switch (columnIndex) {
        case 0:
            return String.class;
        case 1:
            return String.class;
        case 2:
            return String.class;
        case 3:
            return String.class;
        case 4:
            return String.class;
        case 5:
            return String.class;
        default:
            throw new IndexOutOfBoundsException("ColumnIndex out of bounds");
    }
}

@Override
public Object getValueAt(int rowIndex, int columnIndex) {

    clsDadosIniciaisCol cDadosIniciais = linhas.get(rowIndex);

    switch (columnIndex) {
        case 0:
            return cDadosIniciais.getID();
        case 1:
            return cDadosIniciais.getCod();
        case 2:
            return cDadosIniciais.getDescricao();
        case 3:
            return cDadosIniciais.getCol01();
        case 4:
            return cDadosIniciais.getCol02();
        case 5:
            return cDadosIniciais.getCol03();
        default:
            throw new IndexOutOfBoundsException("Column out of bounds");
    }
}

public void setValutAt(Object aValue, int rowIndex, int columnIndex) {
}

;

@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
    return true;
}

public clsDadosIniciaisCol getDadosIniciais(int indiceLinha) {
    return linhas.get(indiceLinha);
}

public void addDadosIniciais(clsDadosIniciaisCol DadosIniciais) {

    linhas.add(DadosIniciais);

    int ultimoIndice = getRowCount() - 1;

    fireTableRowsInserted(ultimoIndice, ultimoIndice);

}

public void removeDadosIniciais(int indiceLinha) {
    linhas.remove(indiceLinha);
    fireTableRowsDeleted(indiceLinha, indiceLinha);
}

public void addListaDadosIniciais(List<clsDadosIniciaisCol> DadosIniciais) {

    int tamanhoAntigo = getRowCount();

    linhas.addAll(DadosIniciais);

    fireTableRowsInserted(tamanhoAntigo, getRowCount() - 1);

}

public void limpar() {
    linhas.clear();
    fireTableDataChanged();
}

public boolean isEmpty() {
    return linhas.isEmpty();
}[/code]