Manipulações no AbstractTableModel

9 respostas
r.campos

Galera..
to com OS SEGUINTES PROBLEMAS:

1º Eu tenho uma JTable com um modelo implementado por mim (segue abaixo).. e é o seguinte:
tem um campo OBS nele é pode ser alterado, ai até ai funciona.. só que vamo supor que eu tenho 5 registros na minha JTable..
eu altero os 5 campos de OBS.. ao terminar de alterar o ultimo eu clico em "SALVAR".. ele salva apenas das 4 primeiras, a ultima não, pois é como se o foco estivesse nela ainda para alteração e nao tivesse "salvo" na minha lista a alteração do ultimo registro! Eu precisava fazer algo do tipo a cada "caracter" inserido.. ele ja salvasse no meu List (eu acho que essa seria a solução - nao sei se me expressei bem.. qualquer coisa falem ai que eu tento explica melhor)

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 "ID";
        } 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) {
        SessaoPresencaIrmaosJTable value = (SessaoPresencaIrmaosJTable) lista.get(rowIndex);
        if (columnIndex == COL_PRESENCA) {
            value.setPresenca((Boolean) aValue);
        } else if (columnIndex == COL_OBS) {
            value.setObs((String) aValue);
        }
        fireTableDataChanged();
    }

    public Object getValueAt(int rowIndex, int columnIndex) {
        SessaoPresencaIrmaosJTable sessao = (SessaoPresencaIrmaosJTable) 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 || columnIndex == COL_OBS) {
            return true;
        } else {
            return false;
        }
    }

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

    @Override
    public int findColumn(String columnName) {
        if (columnName.equals("ID")) {
            return 0;
        } else if (columnName.equals("Nome")) {
            return 1;
        } else if (columnName.equals("Presença")) {
            return 2;
        } else {
            return -1;
        }
    }

}

2º Como deixar apenas o CABEÇALHO ID centralizado?
Ex:
| ID | NOME .................... | OBS ................... | (coloquei os "." pq nao aceita espaços)
só quero o Header (cabeçalho) da coluna ID centralizado..
a coluna em si eu ja consegui com os conteudos.. mais o cabeçalho ou ele aplica em todos.. ou ele peder a formatação natural da JTable..
queria sugestões!

3º Com inserir linha e remover linha do meu modelo?! eu crio um método add.. e dentro dele eu do um lista.add(new SessaoPresencaIrmaosJTable(parametros)); ? e boa?
e pra remoder crio um método del com a linha por parametro e removo na lista aquela determinada linha?!

4º eu ficaria MTO feliz, se alguem podesse da um exemplo como o Vinni deu sobre o
AbstractTableModel.. sobre outros métodos dessa classe.. como: fireTableCellUpdated, addTableModelListener, fireTableChanged, fireTableDataChanged, fireTableRowsDeleted, fireTableRowsInserted, fireTableRowsUpdated, fireTableStructureChanged, getListeners, getTableModelListeners, removeTableModelListener..

se possivel um tutorial.. de como inserir um ComboBox, Button e etc no lugar de um CheckBox
pq isso pode ajuda mta gente inciante em Java como eu..

alguem pode fala assim, nossa quanta dúvida, esse cara nao pesquisa nada.. mais só o fato de estar no forum lendo tópicos e tentando, quebrando a cabeça ja ajuda mtoo.. exemplos práticos de vida real ajudam a idealizar soluções mais concretas para os problemas de cada um!

demais é só..
valeu galera, aguardo retorno de vcs!

9 Respostas

Marky.Vasconcelos

Esses métodos fireX são para indicar que ocorreu alguma alteração no model e a JTable precisa redesenhar algo.

E o método setValueAt só é chamado depois que a célula perde o foco.

r.campos

Mark_Ameba:
Esses métodos fireX são para indicar que ocorreu alguma alteração no model e a JTable precisa redesenhar algo.

E o método setValueAt só é chamado depois que a célula perde o foco.

?!?! eee?!?!
eu sei que vc explico e tal… mais tem como ajuda a resolve esses problemas ai? :?

abraço

Marky.Vasconcelos

Quando voce chama o salvar para a lista?

M

r.campos:
1º Eu tenho uma JTable com um modelo implementado por mim (segue abaixo)… e é o seguinte:
tem um campo OBS nele é pode ser alterado, ai até ai funciona… só que vamo supor que eu tenho 5 registros na minha JTable…
eu altero os 5 campos de OBS… ao terminar de alterar o ultimo eu clico em “SALVAR”… ele salva apenas das 4 primeiras, a ultima não, pois é como se o foco estivesse nela ainda para alteração e nao tivesse “salvo” na minha lista a alteração do ultimo registro! Eu precisava fazer algo do tipo a cada “caracter” inserido… ele ja salvasse no meu List (eu acho que essa seria a solução - nao sei se me expressei bem… qualquer coisa falem ai que eu tento explica melhor)

As mudanças da view só surtem efeito no model quando a célula perde o foco. Se o problema é esse, não vai ter jeito: é preciso tirar o foco da célula para fazer as alterações.

r.campos:
3º Com inserir linha e remover linha do meu modelo?! eu crio um método add… e dentro dele eu do um lista.add(new SessaoPresencaIrmaosJTable(parametros)); ? e boa?
e pra remoder crio um método del com a linha por parametro e removo na lista aquela determinada linha?!

Quase isso: você cria um método add que já recebe um objeto SessaoPresencaIrmaosJTable pronto. Por exemplo:

public void add(SessaoPresencaIrmaosJTable novo) {
    lista.add(novo);
    fireTableDataChanged();
}

O método remover é exatamente como você disse (não esqueça de chamar o fireTableDataChanged() após remover a linha).

r.campos:
4º eu ficaria MTO feliz, se alguem podesse da um exemplo como o Vinni deu sobre o
AbstractTableModel… sobre outros métodos dessa classe… como: fireTableCellUpdated, addTableModelListener, fireTableChanged, fireTableDataChanged, fireTableRowsDeleted, fireTableRowsInserted, fireTableRowsUpdated, fireTableStructureChanged, getListeners, getTableModelListeners, removeTableModelListener…

A interface TableModel define além dos métodos de manipulação de dados os métodos para tratamento de eventos (os listeners). Por isso, se você implementasse essa interface diretamente teria que se preocupar em criar os métodos para adicionar, remover e resgatar os TableModelListener’s além de ter que escrever um monte de código para avisar a cada um dos listeners que um evento aconteceu.
A classe AbstractTableModel implementa a interface TableModel fornecendo os métodos para manipulação de listeners e métodos utilitários para notificá-los (são os que começam com fire, ou seja disparar tal evento). Isso evita que você se preocupe com a implementação da notificação dos listeners (que pode ser meio chata) e se foque na manipulação dos dados do seu sistema.

r.campos

nao entendi a pergunta :S
salva a lista nao é no setValue(); ?!?
agora qdo ele faz isso é depois que sai o foco nao é?!

r.campos

marcobiscaro2112:
r.campos:
1º Eu tenho uma JTable com um modelo implementado por mim (segue abaixo)… e é o seguinte:
tem um campo OBS nele é pode ser alterado, ai até ai funciona… só que vamo supor que eu tenho 5 registros na minha JTable…
eu altero os 5 campos de OBS… ao terminar de alterar o ultimo eu clico em “SALVAR”… ele salva apenas das 4 primeiras, a ultima não, pois é como se o foco estivesse nela ainda para alteração e nao tivesse “salvo” na minha lista a alteração do ultimo registro! Eu precisava fazer algo do tipo a cada “caracter” inserido… ele ja salvasse no meu List (eu acho que essa seria a solução - nao sei se me expressei bem… qualquer coisa falem ai que eu tento explica melhor)

As mudanças da view só surtem efeito no model quando a célula perde o foco. Se o problema é esse, não vai ter jeito: é preciso tirar o foco da célula para fazer as alterações.

r.campos:
3º Com inserir linha e remover linha do meu modelo?! eu crio um método add… e dentro dele eu do um lista.add(new SessaoPresencaIrmaosJTable(parametros)); ? e boa?
e pra remoder crio um método del com a linha por parametro e removo na lista aquela determinada linha?!

Quase isso: você cria um método add que já recebe um objeto SessaoPresencaIrmaosJTable pronto. Por exemplo:

public void add(SessaoPresencaIrmaosJTable novo) {
    lista.add(novo);
    fireTableDataChanged();
}

O método remover é exatamente como você disse (não esqueça de chamar o fireTableDataChanged() após remover a linha).

r.campos:
4º eu ficaria MTO feliz, se alguem podesse da um exemplo como o Vinni deu sobre o
AbstractTableModel… sobre outros métodos dessa classe… como: fireTableCellUpdated, addTableModelListener, fireTableChanged, fireTableDataChanged, fireTableRowsDeleted, fireTableRowsInserted, fireTableRowsUpdated, fireTableStructureChanged, getListeners, getTableModelListeners, removeTableModelListener…

A interface TableModel define além dos métodos de manipulação de dados os métodos para tratamento de eventos (os listeners). Por isso, se você implementasse essa interface diretamente teria que se preocupar em criar os métodos para adicionar, remover e resgatar os TableModelListener’s além de ter que escrever um monte de código para avisar a cada um dos listeners que um evento aconteceu.
A classe AbstractTableModel implementa a interface TableModel fornecendo os métodos para manipulação de listeners e métodos utilitários para notificá-los (são os que começam com fire, ou seja disparar tal evento). Isso evita que você se preocupe com a implementação da notificação dos listeners (que pode ser meio chata) e se foque na manipulação dos dados do seu sistema.

entendi!
nao tem um método que coloca no evento do botão só para tirar o foco daquela celula então?!

[]´s

Marky.Vasconcelos

Assim que um componente ganha o foco a celula devia perder o foco. Isso nao esta acontecendo?

r.campos

então… eu tbm pensei assim
que qdo eu clico no Button
a celula perdi o foco… mais nao deve tá perdendo pq nao tá salvando :S

Marky.Vasconcelos

Coloca um System.out.println no aValue e no index da coluna e testa o código para ver se aparece de todas as colunas quando perde o foco. De vez em quando voce pode fazer algo errado e esta lançando uma Exception que esta sendo engolida e voce nem sabe… ja tive problemas assim.

Criado 16 de março de 2010
Ultima resposta 17 de mar. de 2010
Respostas 9
Participantes 3