Atualizar jTable a partir de um botão!

Pessoal, estou com um pequeno problema e procurei sobre o assunto, porém não encontrei nada específico que me ajuda-se a resolver o problema.

Eu tenho uma classe TestaTableModel.java onde construi um Model segundo o que precisava. Em outra classe chamada Principal.java, estão todos os componentes da parte gráfica.

Bom, na Principal.java tenho uma jTable que usa o TestaTableModel como modelo para construir a tabela.

O que quero fazer é: a partir de um botão na Principal.java, ou seja, quando clicar nesse botão queria que a jTable fosse atualizada, ou seja, que ela chama-se novamente o TestaTableModel para construir a tabela, pois preciso disso para atualizar umas regras de negócio que fiz.

Agradeço a atenção e fico no aguardo.

seuModelo.setNumRows(0); //Zerando a grid
seuModelo.addRow(new Object[]{primeiroElemento,...,ultimoElemento }); // Preenche com os valores novos.

Cara, pelo que entendi, vc sugeriu que apagasse manualmente os valores do modelo e preenchesse de novo? É que assim, queria algo como o método fireTableDataChandeg() que diz pra jTable redesenhar a tabela pq teve alterações. Queria algo que fizesse isso mas através de um botão, ou seja, que ao clicar no botão a jTable desenhasse novamente a tabela.

Abraço e fico no aguardo.

QUe tipo de atualização você que fazer? Incluir uma linha ou atualizar a tela inteira?

Em todo caso, basta no actionPerformed do seu botão reconstruir um novo TestaTableModel e chamar o método setModel do JTable.

[quote=douglastc] seuModelo.setNumRows(0); //Zerando a grid seuModelo.addRow(new Object[]{primeiroElemento,...,ultimoElemento }); // Preenche com os valores novos. [/quote]

Esse trabalho todo existe pq a dica está na porcaria do DefaultTableModel.

Cara, vou tentar te explicar o que preciso fazer, pois não consegui com a dica que me passou. Assim, tenho uma classe chamada “Principal.java” nela tenho toda a parte das interfaces…tenho nela uma jTable que usa o model chamado NotasTableModel que fiz em uma classe separada chamada “NotasTableModel.java”. A NotasTableModel tem o método getValueAt assim:

public Object getValueAt(int row, int column) {
        AlunoSaida aluno = alunosSaida.get(row);
        Principal p = new Principal();
        JComboBox jComboBoxTrimestre = p.getComboBoxTrimestre();
        String trimestre = (String)jComboBoxTrimestre.getModel().getSelectedItem();

       //Verifica qual o trimestre pra saber qual valor devolver
        if (("1º Trimestre").equals(trimestre)) {           
             //Verifica qual valor deve ser retornado
            if (column == COL_ALUNO)
                return aluno.getNome();
            else if (column == COL_AVAL1)
                return aluno.getTrimestre1().getAvaliacao1();
            else if (column == COL_AVAL2)
                return aluno.getTrimestre1().getAvaliacao2();
            else if (column == COL_AVAL3)
                return aluno.getTrimestre1().getAvaliacao3();
            else if (column == COL_AVAL4)
                return aluno.getTrimestre1().getAvaliacao4();
            else if (column == COL_AVAL5)
                return aluno.getTrimestre1().getAvaliacao5();
            else if (column == COL_MEDIA)
                return aluno.getTrimestre1().getMedia();
            else if (column == COL_FALTA)
                return aluno.getTrimestre1().getFaltas();
            else if (column == COL_RECUPERACAO)
                return aluno.getTrimestre1().getRecuperacao();
        }

        if (("2º Trimestre").equals(trimestre)) {
             //Verifica qual valor deve ser retornado
            if (column == COL_ALUNO)
                return aluno.getNome();
            else if (column == COL_AVAL1)
                return aluno.getTrimestre2().getAvaliacao1();
            else if (column == COL_AVAL2)
                return aluno.getTrimestre2().getAvaliacao2();
            else if (column == COL_AVAL3)
                return aluno.getTrimestre2().getAvaliacao3();
            else if (column == COL_AVAL4)
                return aluno.getTrimestre2().getAvaliacao4();
            else if (column == COL_AVAL5)
                return aluno.getTrimestre2().getAvaliacao5();
            else if (column == COL_MEDIA)
                return aluno.getTrimestre2().getMedia();
            else if (column == COL_FALTA)
                return aluno.getTrimestre2().getFaltas();
            else if (column == COL_RECUPERACAO)
                return aluno.getTrimestre2().getRecuperacao();
        }

        if (("3º Trimestre").equals(trimestre)) {
             //Verifica qual valor deve ser retornado
            if (column == COL_ALUNO)
                return aluno.getNome();
            else if (column == COL_AVAL1)
                return aluno.getTrimestre3().getAvaliacao1();
            else if (column == COL_AVAL2)
                return aluno.getTrimestre3().getAvaliacao2();
            else if (column == COL_AVAL3)
                return aluno.getTrimestre3().getAvaliacao3();
            else if (column == COL_AVAL4)
                return aluno.getTrimestre3().getAvaliacao4();
            else if (column == COL_AVAL5)
                return aluno.getTrimestre3().getAvaliacao5();
            else if (column == COL_MEDIA)
                return aluno.getTrimestre3().getMedia();
            else if (column == COL_FALTA)
                return aluno.getTrimestre3().getFaltas();
            else if (column == COL_RECUPERACAO)
                return aluno.getTrimestre3().getRecuperacao();
        }
        return "";
    }

Se você observar, eu preciso testar o valor de um jComboBox pra saber o que fazer. Este jComboBox está na classe “Principal.java” e o problema que estou encontrando é em pegar o valor que está selecionado no jComboBox. Ele sempre me devolve o valor default dele, independente de eu selecionar outro valor, ele devolve sempre o valor default “Selecione um trimestre”.

Talvez o problema possa estar na construção do jComboBox. Ele é construído assim:

[code]jComboBoxTrimestre = new javax.swing.JComboBox();

jComboBoxTrimestre.setModel(new javax.swing.DefaultComboBoxModel(new String[] { “Selecione um trimestre” }));[/code]

E depois ao clicar em um botão eu carrego ele assim:

String trimestre = (String)jComboBoxTrimestre.getSelectedItem(); if (trimestre.equals("Selecione um trimestre")){ // Carrega Combo de Trimestres jComboBoxTrimestre.removeAllItems(); jComboBoxTrimestre.addItem("Selecione um trimestre"); jComboBoxTrimestre.addItem("1º Trimestre"); jComboBoxTrimestre.addItem("2º Trimestre"); jComboBoxTrimestre.addItem("3º Trimestre"); }

Por isso que queria atualizar a jTable, pois quando minha aplicação roda o valor do combo é “Selecione um trimestre” e dependendo do que for escolhido ela então deve mostrar certos dados como o getValueAt está mostrando.

Pensei em fazer assim: Roda a aplicação, seleciono um trimestre, clico num botão e a jTable seria atualizada chamando novamente o getValueAt que leria o valor do combo e saberia o que fazer dependendo do valor.

Agradeço muito a ajuda e espero conseguir resolver…

Grande abraço

Esses métodos “getTrimestre1()”, “getTrimestre2()”, etc, retornam um objeto de que tipo?

Na verdade, seu código precisaria de poucas modificações.

  1. No aluno, crie um método chamado getTrimestre que aceite como parâmetro um número, com o trimestre desejado. Retorne daí um objeto do tipo do trimestre (aqui estou supondo que a classe chama-se Trimestre).

  2. Criar no TableModel uma variável chamada “trimestre” que indica que trimestre o model irá exibir;

  3. Alterar o getValueAt para:

[code]
@Override
public Object getValueAt(int row, int column) {
AlunoSaida aluno = alunosSaida.get(row);
Trimestre trimestre = aluno.getTrimestre(trimestre);

//Verifica qual valor deve ser retornado
if (column == COL_ALUNO)
return aluno.getNome();
if (column == COL_AVAL1)
return trimestre.getAvaliacao1();
if (column == COL_AVAL2)
return trimestre.getAvaliacao2();
if (column == COL_AVAL3)
return trimestre.getAvaliacao3();
if (column == COL_AVAL4)
return trimestre.getAvaliacao4();
if (column == COL_AVAL5)
return trimestre.getAvaliacao5();
if (column == COL_MEDIA)
return trimestre.getMedia();
if (column == COL_FALTA)
return trimestre.getFaltas();
if (column == COL_RECUPERACAO)
return trimestre.getRecuperacao();
return “”;
}[/code]

  1. Criar no model o método setTrimestre, com a seguinte assinatura:

[code]public void setTrimestre(int trimestre) {
this.trimestre = trimestre;

//Isso avisa a tabela que os dados mudaram e que ela deve redesenhar-se.
//O getValueAt será chamado pra pintar o novo conteúdo.
fireTableDataChanged();
}[/code]

  1. Depois, no evento da sua combo, você faz:

String trimestre = jComboBoxTrimestre.getSelectedItem().toString(); if (!trimestre.startsWith("Selecione")) { model.setTrimestre(Integer.parseInt(trimestre.substring(0,1))); }

Cara, entendi em partes tua dica.

Não entendi os itens:

“2” - Criar uma variável trimestre pra toda a classe? Tipo, colocar no início “private Trimestre trimestre;” ?

“4” - Não entendi em qual classe devo inserir esse método e como extamente ele irá funcionar;

“5” - Colocaria isso em qual evento do combobox?

Desculpe por não ter entendido direito, mas estou começando…

Grande abraço, fico no aguardo.

Sem problemas.

2 - A variável chama-se trimestre, é do tipo int, e será criada no seu TableModel;
4 - Esse método é inserido também no TableModel. O método faz o seguinte:

  • Altera o valor do atributo trimestre para o novo inteiro;
  • Dispara o evento avisando a tabela que o conteúdo mudou, e precisa ser redesenhado;
    5 - Você coloca aquilo no evento actionPerformed do combobox.

Anexa aqui seu TableModel e sua classe AlunoSaida, que fica mais fácil de eu explicar para você como funciona.

Use a opção de attachments, pq tanto código assim direto no post vai deixar o tópico meio travado.

Cara, anexei as três classes: AlunoSaida(classe aluno), TrimestreSaida(classe trimestre) e NotasTableModel(o model).

No item 4 eu não entendi quando e como o model vai ver que o trimestre foi mudado e a tabela precisa ser redesenhada. Outro detalhe, posso colocar o método descrito no item 5 no evento de um botão? Pergunto pois outros combos serão mudados tb e vou carregar certo conteúdo de acordo como os combos que forem selecionados, ou seja, para mim seria melhor se pudesse colocar o método descrito no item 5 no evento de um botão.

Fico no aguardo.

Grande abraço.

Oi. Quanto ao item 5, pode sim, ser num botão.

Funciona assim.

  1. O usuário altera as combos e clica no botão;
  2. O seu actionPerformed do botão identifica que o trimestre na combo mudou, e chama o método setTrimestre do model, indicando que trimestre foi selecionado;
  3. Esse método altera a variável trimestre do model, e dispara o evento fireTableDataChanged;
  4. Ao receber o evento, a tabela redesenha o conteúdo;
  5. Para redesenhar o conteúdo, ela dispara o getValueAt, que agora se baseará no novo trimestre, fornecido pelo actionPerformed.

Já vejo suas classes. Agora estou meio ocupado, vou ter tempo de ver na hora do almoço.

Cara, acho que entendi direitinho agora, esta varíavel trimestre da classe model, é a mesma que será usada como parâmetro no método que busca o trimestre do aluno certo?

Nessa linha acontece isso né?

Acho que vou colocar assim para que possa ficar um pouco mais claro no meu código:

Vou tentar aqui e depois posto o resultado.

Abração e obrigado por enquanto.

É isso mesmo.

Funcionou cara, tudo certinho.

Bom, por enquanto era isso. Qualquer coisa peço ajuda de novo.

Muito obrigado aí pela ajuda e paciência.

Abração.

Cara, apareceu um probleminha.

A jTable até é redesenhada direitinho e tal, porém quando digito os valores nas células, os mesmo não ficam, eles apagam quando troco de célula e não aparece nenhuma exceção e tal.

Estas classes em anexos são as atualizadas caso precise dar uma olhada.

Abraço e fico no aguardo.