[Resolvido] JTable: AbstractTableModel

5 respostas
r.campos

boa tarde galera,

andei lendo vários tópicos sobre JTable aqui no fórum, e a galera sempre insites em usar a AbstractTableModel
bom peguei o caminho da roça junto com alguns exemplo que vi por aqui e o vinni me mostro outro por MP e CRIEI a minha baseada nos conceitos que entendi!
obs: me informem se algum conceito estiver errado…

segue minhas classe e a função que insere na JTable

Classe do “List”

public class SessaoPresencaIrmaosJTable {

    private int irmCodigo = 0;
    private String irmNome = "";
    private boolean presenca = false;
    private String obs = "";

    public SessaoPresencaIrmaosJTable(int irmCodigo, String irmNome, int presenca, String obs) {
        this.irmCodigo = irmCodigo;
        this.irmNome = irmNome;
        if (presenca != 0) {
            this.presenca = true;
        } else {
            this.presenca = false;
        }
        this.obs = obs;
    }

    public int getIrmCodigo() {
        return irmCodigo;
    }

    public void setIrmCodigo(int irmCodigo) {
        this.irmCodigo = irmCodigo;
    }

    public String getIrmNome() {
        return irmNome;
    }

    public void setIrmNome(String irmNome) {
        this.irmNome = irmNome;
    }

    public String getObs() {
        return obs;
    }

    public void setObs(String obs) {
        this.obs = obs;
    }

    public boolean isPresenca() {
        return presenca;
    }

    public void setPresenca(boolean presenca) {
        this.presenca = presenca;
    }
}

Modelo da JTable

public class SessaoPresencaTableModel extends AbstractTableModel {

    private static final int COL_IRMCODIGO = 0;
    private static final int COL_IRMNOME = 1;
    private static final int COL_PRESENCA = 2;
    private static final int COL_OBS = 3;
    private List<SessaoPresencaIrmaosJTable> lista;

    public SessaoPresencaTableModel(List<SessaoPresencaIrmaosJTable> lista) {
        this.lista = lista;
    }

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

    public int getColumnCount() {
        return 4;
    }

    @Override
    public String getColumnName(int column) {
        if (column == COL_IRMCODIGO) {
            return "Código";
        } else if (column == COL_IRMNOME) {
            return "Nome";
        } else if (column == COL_PRESENCA) {
            return "Presença";
        } else if (column == COL_OBS) {
            return "Observação";
        } else {
            return "";
        }

    }

    @Override
    public Class<?> getColumnClass(int columnIndex) {
        if (columnIndex == COL_IRMCODIGO) {
            return Integer.class;
        } else if (columnIndex == COL_IRMNOME) {
            return String.class;
        } else if (columnIndex == COL_PRESENCA) {
            return Boolean.class;
        } else if (columnIndex == COL_OBS) {
            return String.class;
        } else {
            return String.class;
        }
    }

    @Override
    public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
        super.setValueAt(aValue, rowIndex, columnIndex);
    }

    public Object getValueAt(int rowIndex, int columnIndex) {
        SessaoPresencaIrmaosJTable sessao = lista.get(rowIndex);
        if (columnIndex == COL_IRMCODIGO) {
            return sessao.getIrmCodigo();
        } else if (columnIndex == COL_IRMNOME) {
            return sessao.getIrmNome();
        } else if (columnIndex == COL_PRESENCA) {
            return sessao.isPresenca();
        } else if (columnIndex == COL_OBS) {
            return sessao.getObs();
        } else {
            return "";
        }
    }

    @Override
    public boolean isCellEditable(int rowIndex, int columnIndex) {
        if (columnIndex == COL_PRESENCA) {
            return true;
        } else {
            return false;
        }
    }

    public SessaoPresencaIrmaosJTable get(int row) {
        return lista.get(row);
    }

Joga no JTable

private void iniciaLista() {
        try {
            if (!stats) {
                String sql = "SELECT ir.irm_codigo, ir.irm_nome ";
                sql += "FROM Irmaos AS ir ORDER BY ir.irm_nome";
                ResultSet rsAux = Operacoes.consulta(sql, con);
                if (rsAux != null) {
                    rsAux.beforeFirst();
                    while (rsAux.next()) {
                        linha = new SessaoPresencaIrmaosJTable(rsAux.getInt("irm_codigo"), rsAux.getString("irm_nome"), 0, "");
                        lista.add(linha);
                    }
                }
            } else {
                String sql = "SELECT ir.irm_codigo, ir.irm_nome, sp.spr_presenca, sp.spr_obs ";
                sql += "FROM Irmaos AS ir INNER JOIN ";
                sql += "PresencaSessoes AS sp ON ir.irm_codigo = sp.irm_codigo ";
                sql += "WHERE (sp.ses_codigo = " + sesAtual + ")";
                ResultSet rsAux = Operacoes.consulta(sql, con);
                if (rsAux != null) {
                    rsAux.beforeFirst();
                    while (rsAux.next()) {
                        linha = new SessaoPresencaIrmaosJTable(rsAux.getInt("irm_codigo"), rsAux.getString("irm_nome"), rsAux.getInt("spr_presenca"), rsAux.getString("spr_obs"));
                        lista.add(linha);
                    }
                }
            }
            modelo = new SessaoPresencaTableModel(lista);
            tabela.setModel(modelo);
        } catch (SQLException ex) {
            Logger.getLogger(sisSessaoPresencaIrmaos.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

agora como nada são flores na vida… segue o problema
rsrsrsrsrs

a a minha coluna PRESENÇA ela tem que estar como editável, assim pode marca um sim/não (lembrando que essa coluna é Boolean.class então é um checkbox)
e nao está deixando editar :S sabem me dizer o pq?

e tbm…
eu queria saber se é nessa classe que eu altero o tamanho de cada coluna, fonte da tabela…
cor de linhas e tal!
ou se é em outra classe… se for em outra… me passa o que procurar sobre isso!

creio eu que nao seja uma coisa mto complicada até pq a minha JTable é simples, mais por questões de sempre utilizar o DefaultModel da tabela e nunca ter usado o AbstractTableModel (que acabei percebendo nao ser um bixo de 7 cabeças) fico meio complicado e sem saber o que fazer!

aguardo a ajuda de todos!

[]´s

5 Respostas

ViniGodoy

Está quase pronto. Mas funciona assim. Quando alguém marca o checkbox, o JTable chama o setValueAt, passando com o parâmetro a linha em que o checkbox foi alterado, a coluna (no caso, a do checkbox) e o novo valor definido para o check. Nesse momento, você deve alterar o valor da presença na sua lista, para que então o novo valor retorne no getValueAt.

Como você não alterou o valor, logo que o checkbox é marcado, o JTable chama o getValueAt daquela coluna, para ver o valor foi aceito pelo model ou não. Sua lista não foi alterada, então, o checkbox continuará no estado anterior.

Para implementa-lo basta fazer:

@Override public void setValueAt(Object aValue, int rowIndex, int columnIndex) { SessaoPresencaIrmaosJTable value = (SessaoPresencaIrmaosJTable) lista.get(rowIndex); if (columnIndex == COL_PRESENÇA) { value.setValue((Boolean)aValue); } }

r.campos

grande vinni,
valeu pela força

me corrija se eu estiver errado!

fica assim?

@Override public void setValueAt(Object aValue, int rowIndex, int columnIndex) { SessaoPresencaIrmaosJTable value = (SessaoPresencaIrmaosJTable) lista.get(rowIndex); if (columnIndex == COL_PRESENCA) { super.setValueAt((Boolean) aValue, rowIndex, columnIndex); //value.setValue( aValue); } }

pq se fica :S ainda nao tá deixando editar =///
que que será que pode ser? ;/

[]´s

r.campos

oooo
consegui
entendi o que vc quiz dizer

desculpa pela certa “ignorância”

fica assom

@Override public void setValueAt(Object aValue, int rowIndex, int columnIndex) { SessaoPresencaIrmaosJTable value = (SessaoPresencaIrmaosJTable) lista.get(rowIndex); if (columnIndex == COL_PRESENCA) { //super.setValueAt(aValue, rowIndex, columnIndex); value.setPresenca((Boolean) aValue); } }

kkaokakoakoako
valeu

ViniGodoy

Pois é, tava me perguntando o que vc não tinha entendido, se eu tinha postado o código pronto ali… uaheuhaueheau

Mas o negócio é esse mesmo. A Table fala pro setValueAt o que mudou, e você é responsável por mudar isso nos seus objetos.

Agora, você pode criar métodos get(), add() e remove() que trabalhem com seus próprios objetos. Basta para isso manipular essa lista e disparar os eventos com fireTableRowsAdded, removed, etc… Nada mais de ficar lidando com vetores de objects, fazendo typecasts, ou tendo que copiar campos pra lá e para cá.

r.campos

ahan… entendi…
obrigado pela força, funciona perfeito aqui agora koakoakoakoakoakoako

agora 3 coisas

1ª que eu preciso agora
eu quero alinha o Header ID centralizado e o a column ID, a column eu ja consegui, já o Header ID nao :S, se eu alinha ela acaba alinhando todos os Headers… e nao quero… quero só ela!
tem como?

2ª eu entendi e td como funciona pois seu tópico que vc me mando por MP é mto bom… sobre AbstractTableModel,
agora queria saber como usar o AbstractCellEditor junto com ele! tem algum tópico tbm?

3ª eu consigo ver (pois aprendi) como colocar o CheckBox… mais se eu quisesse coloca um JButton? um JComboBox?

agradeço se poder me ajudar TBM com isso!
[]´s

Criado 6 de março de 2010
Ultima resposta 7 de mar. de 2010
Respostas 5
Participantes 2