jFormattedTextField nao atualiza

12 respostas
rafa120

Olá pessoal
vcs sabem me dizer pq o meu jFormattedTextField não atualiza os dados que vem do banco?

Eu tenho uma tabela que mostra os dados do banco, que ao clicar nela seta estes dados nos jTextField e nos jFormattedTextField.
ai quando eu clico em um registro, vem os dados. Ai se o campo que tem o formatted tiver dado, ele atualiza! se nao tem nada, ele MANTEM o dado anterior!

pq será?
este este código é que faz mostrar os dados nos componentes, tem mais um tanto, mas eu deixei ai só o que é jFormatted e que uso mascara é claro…

private void jTTabelaLinhaSelecionada(JTable tabela) { if (jTTabela.getSelectedRow() != -1) { txtCEP.setText(fornecedores.get(tabela.getSelectedRow()).getCep()); } else { return; } }

E o maskformatter eu vo la no componente jFormatted e coloco em Código de pré-criação… mas acredito q isso nao tem nada a ver…mas só pra mostrar mesmo

try { formatacaoCEP = new MaskFormatter("#####-###"); } catch (Exception erro) { JOptionPane.showMessageDialog (null, "Não foi possível setar a máscara"+erro); }

12 Respostas

M

Bom, sem codigo vamos esperar que alguem com poderes mediunicos se manifeste aqui no forum.

rafa120

Editado! coloquei no primeiro post

discorpio

Boa tarde a todos.

Em primeiro lugar, voce instanciou seu JFormattedTextField desta forma:

JFormattedTextField txtCep = new JFormattedTextField(formatacaoCEP);

Bom, se sim então atualize o seu código para este:

private void jTTabelaLinhaSelecionada(JTable tabela)  {   
    if (tabela.getSelectedRow() != -1)  { 
        String cep = fornecedores.get(tabela.getSelectedRow()).getCep();  
        if (cep != null) {
           txtCEP.setText(cep);
        } else {
           txtCEP.setText("");
        }  
    } else {
        JOptionPane.showMessageDialog(null, "Não há linhas para selecionar); 
    }   
}

Repare que eu substitui dentro do “if” o jTTabela pela instancia tabela, e vai ver que era isso porque não estava atualizando.

rafa120

É este modelo mesmo discorpio que eu uso
Testei este modelo, mas nada feito

Tentei também outras maneiras e nada

alguém tem mais outra idéia?

discorpio

rafa120:
É este modelo mesmo discorpio que eu uso
Testei este modelo, mas nada feito

Tentei também outras maneiras e nada

alguém tem mais outra idéia?

Boa noite rafa120.

Voce reparou esta minha observação abaixo:

Voce está passando como parâmetro a instância tabela, porém está fazendo referência a jTTabela.

private void jTTabelaLinhaSelecionada(JTable tabela)  {
     
    if (jTTabela.getSelectedRow() != -1)  { 
       /* repare esta linha acima, voce está fazendo referência à jTTabela
          quando deveria fazer referência a parâmetro tabela */
         ....
         ...
    } else {   
        JOptionPane.showMessageDialog(null, "Não há linhas para selecionar);   
    }     
}
rafa120

Sim, eu percebi a troca do jTTabela pelo tabela
mas mesmo assim não deu
tentei estas duas maneiras abaixo tb...

if (cep != null)
            {
                txtCEP.setText(cep);                
            }
            else
            {
                txtCEP.setText("     -   ");
            }
if (cep.equals("     -   ") || cep != null)
            {
                txtCEP.setText(cep);
                    
            }
            else
            {
                txtCEP.setText(null); 
            }
discorpio

Olá, sou eu denovo.

Bom se o JTable está sendo populado corretamente com os registros que ele traz do banco, então eu perqunto, [color=blue]e o ArrayList fornecedores está sendo populado também corretamente no momento em que ele popula o JTable :?:[/color].

A meu ver o seu código ficaria melhor assim:

private void populateTxtEdits(JTable tabela)  {
    Integer linha = tabela.getSelectedRow();     
    if (linha != -1)  {
        txtCampo1.setText(tabela.getValueAt(linha,0);
        txtCampo2.setText(tabela.getValueAt(linha,1);
        txtCEP.setText(tabela.getValueAt(linha, 2);
        ......
        ......
    } else {   
        JOptionPane.showMessageDialog(null, "Não há linhas para selecionar);   
    }     
}

Mesmo que a celúla do JTable estiver nula, isto voce perceberá quando ela for populada, os TxtEdits também receberão valores nulos, o que é o correto, pois não há neste caso, valores vindo da tabela.

rafa120

hmm
acho que este código abaixo nao tem nada a ver, mas sei la né…
será que é nele?

private void mostraPesquisa(List<CadFornecedor> fornecedores) { while (tmFornecedor.getRowCount()>0) { tmFornecedor.setRowCount(0); //setRowCount(0); //removeRow(0); } if (fornecedores.size() == 0) { JOptionPane.showMessageDialog(this, "Nenhum fornecedor cadastrado", "Erro", WIDTH); } else { String[] linha = new String [] {null, null, null}; for (int i = 0; i < fornecedores.size(); i++) { tmFornecedor.addRow(linha); tmFornecedor.setValueAt(fornecedores.get(i).getRazao_social(), i, 0); tmFornecedor.setValueAt(fornecedores.get(i).getNome_fantasia(), i, 1); tmFornecedor.setValueAt(fornecedores.get(i).getCnpj(), i, 2); } } }

discorpio

Boa tarde a todos.

Com certeza é:

O código mais certo é:

private void mostraPesquisa(List<CadFornecedor> fornecedores) {
    Integer row = tmFornecedores.getRowCount()
    for (int i = 0; i < row; i++)   
    {
        tmFornecedores.removeRow(i);
    } 
    if (fornecedores.size() == 0)   
    {   
       JOptionPane.showMessageDialog(this, "Nenhum fornecedor cadastrado", "Aviso", JOptionPane.WARNING_MESSAGE);   
    }   
    else   
    {   
        String[] linha = new String [] {null, null, null};   
        for (int i = 0; i < fornecedores.size(); i++)   
        {   
            tmFornecedor.addRow(linha);   
            tmFornecedor.setValueAt(fornecedores.get(i).getRazao_social(), i, 0);   
            tmFornecedor.setValueAt(fornecedores.get(i).getNome_fantasia(), i, 1);   
            tmFornecedor.setValueAt(fornecedores.get(i).getCnpj(), i, 2);   
        }   
    }   
}

Porque voce não utiliza uma Classe herdada de [color=blue]"AbstractTableModel&quot[/color]; para popular os seus JTables :?:

[color=blue]AbstractTableModel é muito melhor do que voce utilizar DefaultTableModel;[/color]

Com ela voce pode até utilizar apenas um JTable, e criar as classes extensível a AbstractTableModel, onde nesta classe voce popula os JTables com os ArrayList as suas respectivas colunas inclusive, e depois é só setar o JTable assim:

tmFornecedor.setModel(new MeuAbstractTableModel(fornecedores));

É que neste momento, estou acessando uma outra máquina aqui na Empresa, porém quando eu estiver lá na minha, te passarei o código de como fazer isto.

discorpio

Olá, sou eu de novo.

Como prometido, vamos fazer esta classe AbstractTableModel, desta forma:

package tabelas;

import principal.CadFornecedor;
import javax.swing.table.AbstractTableModel;

public class TableModelFornecedor extends AbstractTableModel {

    private List<CadFornecedor> fornecedores
    private static final String[] col = {"ID","Razão Social","Nome Fantasia","CNPJ"};

    public TableModelFornecedor(List<CadFornecedor> fornecedores){
        this.fornecedores = fornecedores;
        fireTableStructureChanged();
    }

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

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

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        Object[] row = (Object[])fornecedores.get(rowIndex);
        return row[columnIndex];
    }

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

    
    @Override
    public boolean isCellEditable(int rowIndex, int columnIndex){
        /* Aqui voce indica qual coluna vai ser editável ou não,
            Abaixo, somente a primeira coluna não é editável */
        if (columnIndex==0){
            return false;
        } else {
            return true;
        } 
    }

    @Override
    public Class getColumnClass(int column){
        // Aqui voce indica qual tipo de dado é retornado nas colunas
        if (column==0){
            return Integer.class;
        } else {
            return String.class;
        }
    }

    public List<CadFornecedores> getDataSet(){
       // Aqui voce retorna todo o conjunto de dados
       return fornecedores;
    }

    @Override
    public String getColumnName(int column){
        // Aqui define os nomes da colunas
        return col[column];
    }

    public Object[] getRow(int row) {
         // Aqui voce retorna um linha de registro inteira.
         return (Object[]) fornecedores.get(row);
    }

    public void removeRow(int row) {
         // Aqui voce remove uma linha específica
         fornecedores.remove(row);
         fireTableDataChanged();
    }

    public void addRow(Object[] row) {
        // Aqui voce acrescenta uma linha com um conjunto de registros específico
        fornecedores.add(row);
        fireTableDataChanged();
    }

    public void addEmptyRow(){
        // Aqui voce acrescenta uma linha em branco
        Object[] row = {0,"","",""};
        fornecedores.add(row);
        fireTableDataChanged();
    }

}

Bom, no momento da instanciação do seu JTable tmFornecedores, voce vai instanciar assim:

....
   List<CadFornecedores> fornecedor;
   JTable tmFornecedores = new JTable(new TableModelFornecedor(fornecedor));
   // Se o List fornecedor estiver vazio, na linha debaixo, ele cria um JTable vazio também, 
   ....

Agora lá no método mostraPesquisa, configure-o assim:

private void mostraPesquisa(List<CadFornecedor> fornecedores) {
    tmFornecedor.setModel(new TableModelFornecedor(fornecedores));
   /* Não se preocupe em limpar o JTable primeiro, pois quando voce cria uma nova Classe
      TableModelFornecedor ele substitue a nova classe apagando a anterior */
}

Agora quando voce quiser:

// Acrescentar uma linha em branco
    (TableModelFornecedor)tmFornecedor.getModel().addEmptyRow();

    // Remover uma linha específica, digamos a linha 5, que corresponde o número de linha 4.
    (TableModelFornecedor)tmFornecedor.getModel().removeRow(4);

    // Pegando todos os fornecedores dentro do JTable:
    List<CadFornecedores> fornec = (TableModelFornecedor)tmFornecedor.getModel().getDataSet();

    // Acrescentando um conjuto de registros dentro do JTable
    Object[] dados = {24,"Tabajara Xuruca","Xurupita","[CPF removido]"}
    (TableModelFornecedor)tmFornecedor.getModel().addRow(dados);

Bom, se voce observar, eu tive que fazer o Casting (TableModelFornecedor) com getModel do JTable, isto porque o getModel do JTable retorna uma classe do tipo TableModel, portanto deve-se fazer a conversão para TableModelFornecedor que é AbstractTableModel. Existe também um meio de se evitar de escrever tanto Casting assim, que é criar um método desta forma:

public TableModelFornecedor getModelFornecedor() {
   return (TableModelFornecedor)tmFornecedor.getModel();
}

Agora é só substituir as dicas acima assim:

// Acrescentar uma linha em branco
    getModelFornecedor().addEmptyRow();

    // Remover uma linha específica, digamos a linha 5, que corresponde o número de linha 4.
    getModelFornecedor().removeRow(4);

    // Pegando todos os fornecedores dentro do JTable:
    List<CadFornecedores> fornec = getModelFornecedor().getDataSet();

    // Acrescentando um conjuto de registros dentro do JTable
    Object[] dados = {24,"Tabajara Xuruca","Xurupita","[CPF removido]"}
    getModelFornecedor().addRow(dados);

Repare quanto código voce enxugou :shock: :slight_smile: :smiley: :lol: 8)

rafa120

Oi novamente!!
Semana toda de prova na faculdade, nem liguei computador nesta semana, mas voltando ao codigo

a class TableModelFornecedor ta dando erro nos objects que chama o fornecedores

@Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        //Object[] row = new Object[rowIndex];
        Object[] row = (Object[])fornecedores.get(rowIndex); // inconvertible types, requerido java.lang.object
        return row[columnIndex];
    }

    @Override
     public void setValueAt(Object value, int row, int col) {
        Object[] dado = (Object[])fornecedores.get(row); // inconvertible types, requerido java.lang.object
        dado[col] = value;
        fireTableCellUpdated(row, col);
     }
e tem mais outros pra baixo tb,
public void addRow(Object[] row) {
        // Aqui voce acrescenta uma linha com um conjunto de registros específico
        fornecedores.add(row);
        fireTableDataChanged();
    }

pelo que percebi a List fornecedores nao ta dando certo com os objects

discorpio

Boa tarde a todos.

Me desculpe por demorar a responder, mas acredito que o erro seja o tipo de dado que voce está tentando inserir num célula, cuja classe é do tipo Integer e a mesma seja String, isto porque lembra deste método abaixo:

@Override  
     public Class getColumnClass(int column){  
         // Aqui voce indica qual tipo de dado é retornado nas colunas  
         if (column==0){  
             return Integer.class;  
         } else {  
             return String.class;  
         }  
     }

No caso acima, se voce utilizar o método “setValueAt(…)” desta forma:

(TableModelFornecedor)tmFornecedor.getModel().setValueAt("",0,0);
   
    // ou 

    getModelFornecedor().setValueAt("",0,0);

Vai gerar erro, porque a primeira coluna, conforme o código anterior foi configurada para retornar um dado do tipo Integer.

Outra coisa é que vou pedir desculpas a voce e corrigir o código do construtor que te passei, pois tem um erro, substitua pelo código abaixo:

public  TableModelFornecedor(List<CadFornecedor> fornecedores){  
         this.fornecedores = new ArraList<CadFornecedor>(fornecedores);  
         fireTableStructureChanged(); 
 }
Criado 10 de abril de 2010
Ultima resposta 20 de abr. de 2010
Respostas 12
Participantes 3