Meu próprio DefaultTableCellRenderer

Olá eu desenvolvi esse padrão de manipulação de células de uma JTable. Penso que não esteja correto mas preciso da opinião de vocês.

Criei um modelo da JTable

package org.ws;

import java.util.ArrayList;
import javax.swing.table.AbstractTableModel;

public class SimpleTableModel extends AbstractTableModel {

    private ArrayList linhas = null;
    private String[] colunas = null;
    private boolean[] colsEdicao;

    public SimpleTableModel(ArrayList dados, String[] colunas) {
        this.setLinhas(dados);
        this.setColunas(colunas);
    }

    @Override
    public String getColumnName(int col){
        return getColunas()[col];
    }
    public void removeRow(int row) {
        getLinhas().remove(0);
        fireTableRowsDeleted(row, row);
    }

    public void addRow(String[] dadosLinha) {
        getLinhas().add(dadosLinha);
        int linha = getLinhas().size() - 1;
        fireTableRowsInserted(linha, linha);
    }

    public int getRowCount() {
        return getLinhas().size();
    }

    public int getColumnCount() {
        return getColunas().length;
    }

    public Object getValueAt(int rowIndex, int columnIndex) {
        String[] linha = (String[]) getLinhas().get(rowIndex);
        return linha[columnIndex];
    }

    @Override
    public void setValueAt(Object value, int row, int col) {
        String[] linha = (String[]) getLinhas().get(row);
        linha[col] = (String) value;
        fireTableCellUpdated(row, col);
    }

    /**
     * @return the linhas
     */
    public ArrayList getLinhas() {
        return linhas;
    }

    /**
     * @param linhas the linhas to set
     */
    public void setLinhas(ArrayList linhas) {
        this.linhas = linhas;
    }

    /**
     * @return the colunas
     */
    public String[] getColunas() {
        return colunas;
    }

    /**
     * @param colunas the colunas to set
     */
    public void setColunas(String[] colunas) {
        this.colunas = colunas;
    }
}

depois eu criei minha própria classe que trata do DefaultTableCellRenderer dessa JTable ao invés de usar os seus métodos na Exibição…

package org.ws;

import javax.swing.JTable;
import javax.swing.SwingConstants;
import javax.swing.table.DefaultTableCellRenderer;

public class MyDefaultTableCellRenderer {

    private DefaultTableCellRenderer renderer = null;
    private JTable tabela;

    public MyDefaultTableCellRenderer(JTable tabela) {
        renderer = new DefaultTableCellRenderer();
        setTabela(tabela);
    }

    public void setWidthColuna(int col,int width) {
        getTabela().setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
        getTabela().getColumnModel().getColumn(col).setPreferredWidth(width);
    }

    public void alinharEsquerda(int col) {
        getRenderer().setHorizontalAlignment(SwingConstants.LEFT);
        getTabela().getColumnModel().getColumn(col).setCellRenderer(getRenderer());
    }

    public void alinharCentro(int col) {
        getRenderer().setHorizontalAlignment(SwingConstants.CENTER);
        getTabela().getColumnModel().getColumn(col).setCellRenderer(getRenderer());
    }

    public void alinharDireita(int col) {
        getRenderer().setHorizontalAlignment(SwingConstants.RIGHT);
        getTabela().getColumnModel().getColumn(col).setCellRenderer(getRenderer());
    }

    /**
     * @return the renderer
     */
    public DefaultTableCellRenderer getRenderer() {
        return renderer;
    }

    /**
     * @param renderer the renderer to set
     */
    public void setRenderer(DefaultTableCellRenderer renderer) {
        this.renderer = renderer;
    }

    /**
     * @return the tabela
     */
    public JTable getTabela() {
        return tabela;
    }

    /**
     * @param tabela the tabela to set
     */
    public void setTabela(JTable tabela) {
        this.tabela = tabela;
    }
}

e por fim o JFrame que exibe essa JTable

private void formComponentShown(java.awt.event.ComponentEvent evt) {                                    
        ArrayList dados = new ArrayList();
        String[] colunas = new String[]{"Estado", "Cidade","População"};
        boolean[] edicao = {false,false};
        dados.add(new String[]{"SP", "São Paulo","14.000.000.000"});
        dados.add(new String[]{"BA", "Salvador","3.000.000.000"});
        dados.add(new String[]{"RN", "Rio de Janeiro","9.000.000.000"});
        dados.add(new String[]{"ES", "Vitória","1.000.000.000"});
        SimpleTableModel modelo = new SimpleTableModel(dados, colunas);

        tabela.setModel(modelo);
        tabela.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        MyDefaultTableCellRenderer celulas = new MyDefaultTableCellRenderer(tabela);
        celulas.setWidthColuna(0, 50);
        celulas.setWidthColuna(1, 300);
        celulas.setWidthColuna(2, 200);
        celulas.alinharCentro(0);
        celulas.alinharCentro(2);
        doLayout();
    } 

eu deixei tudo modularizado, tendo a mesma intenção da DefaultTableModel. Fiz o mesmo com o DefaultTableCellRenderer. É um padrão correto de desenvolvimento?

Você percebeu que seu TableModel tem a mesma cara de DefaultTableModel?

Você passa um vetor de Strings para adicionar na tabela. Isso não é correto uma vez que Java é orientado a objetos (não a Strings).

O certo seria ter um objeto (Registro, por exemplo) e ter um RegistroTableModel, senão não há motivo para criar um TableModel…

[quote=marcobiscaro2112]Você percebeu que seu TableModel tem a mesma cara de DefaultTableModel?

Você passa um vetor de Strings para adicionar na tabela. Isso não é correto uma vez que Java é orientado a objetos (não a Strings).

O certo seria ter um objeto (Registro, por exemplo) e ter um RegistroTableModel, senão não há motivo para criar um TableModel…[/quote]

Não entendi essa última?
O certo seria ter um objeto (Registro, por exemplo) e ter um RegistroTableModel, senão não há motivo para criar um TableModel…