Atualização Jtable após utilizar (remove row e Filter)

Infelizmente sei que todos que realmente entende de Java, são contra DefaultTableModel. Mas como estou iniciando e sabendo que iniciei da forma errada, pois quando se aprende por contra própria estamos sujeitos a estes tipos de erros.
Mas preciso terminar um projeto teste que estou fazendo e só falta um passo, que é atualizar minha Jtable após filtrar a linha e remove -la. Depois que finalizar ele vou refazer todo o código utilizando minha propria AbstractTable que é o correto viu ViniGodoy rsrsrs…
Mas vamos lá ao exemplo:
Desenvolvimento de aplicação para Manipular Medicações, não vou colocar o código todo, pois e meio complexo e extenso, vou tentar explicar de forma simples para ver se conseguem entender o problema e a ideia do funcionamento do mesmo.

-> Tenho duas Jtable em uma JTabbedPane, uma chama jtableFila e outra JtableManipular.
-> Metodos com código SQL que, um:
…AtualizaFila(): Cria as linhas para o JtableFila com os pacientes do dia,
…Manipular(): Grava no banco o paciente e remove da Fila (JtableFila)
…AtualizaManipular(): Mostra o paciente em manipulação
…Gravar(): Grava paciente da JtableManipular e outro Banco.
-> E tenho o metodo de Filtra que é assim:
private void FiltroFila (String query, int Col){
//Filtra informações da Jtable (FILA)

    TableRowSorter<DefaultTableModel> tr = new TableRowSorter<DefaultTableModel> (model);
    tb_fila.setRowSorter(tr);
    
    tr.setRowFilter(RowFilter.regexFilter(query, Col));
}

Execução:

-> Quando inicio o programa e atualizo a Fila - TUDO OK;
-> Executo o Metodo FiltroFila que localiza o codigo lido e seleciona a linha encontrada, mostrando somente ela na Fila - TUDO OK;
-> Executo depois o método Manipular(): Pega a linha selecionada, Grava no Banco, Adicione na JtableManipular e remove a linha selecionada da JtableFila;
-> E para Finalizar executo o método Gravar(): Pega a linha selecionada e grava em outro banco de dados e limpa tabela.
Problema:
-> Após executar o método Gravar(): Alem de gravar no banco, ele tem que no final da execução, atualizar a JtableFila com as novas informações ou trazer as informações de volta, igual a primeira execução quando inicia a aplicação e executa o AtualizarFila.

Só que isso não ocorre. Já fiz todas as tentativas que encontrei aqui no forum sem sucesso. Agradeço a quem puder me ajudar.

Perguntas:
1 - do item selecionado da jtable fila é removido e passado para jtable manipular?
2 - na jtable manipular é modificada algum dado e depois gravado no banco?

jacoboliveira, segue suas respostas:

1 - Sim
2 - Sim - Quando ele e gravado no banco vindo da jtable fila, ele tem um status adicionado E (Em manipulação)

Depois que sai de manipulação e grava no banco eu executo o metodo abaixo para garantir que não haverá linhas na tabela para conseguir atualizar novamente na Jtable Fila:
}
private void ClearQueue() {
//Remove linhas da Tabela Fila
DefaultTableModel tableModel = (DefaultTableModel) tb_fila.getModel();
while (tableModel.getRowCount() > 0) {
tableModel.removeRow(0);

   }
  tableModel.fireTableDataChanged();
  
}//Encerra Classe ClearQueue();
  • Ele zera a fila fica == 0, mas não atualiza mais a jtable Fila, a não ser que fecho e abro novamente a aplicação.

VC pode fazer o seguinte se vc quer repopular a jtable fila coloca uma chamada para um método por exemplo repopularFila() apos o método clesrqueue(), abaixo tem um exemplo de como repopular usando um defaulttablemodel, segue
`

 void	setDataVector(Object[][] dataVector, Object[] columnIdentifiers)
 Ou
 void	setDataVector(Vector dataVector, Vector columnIdentifiers)

`
Nesses dois exemplos vc informa os dados ou no formato de uma matriz bidimensional e um array das colunas, ou no segundo exemplo vc informa um a coleção vetor e um vetor de colunas
Se vc não quiser usar esses métodos por causa das colunas q tem. Que informar, usa o addrow, faz um for ou while para repopular o jtable fila assim no momento que vc gravar vc recupera do banco os dados que pertence jtable com estes procedimentos acima, logicamente vc cria um método que foi suptracitado, coloque abaixo do clearqueue,pronto espero q seja isso que vc estava querendo

Em se tratando de performance isso que te passei não é recomendável, pois vamos supor existam 10000 , se vc remover todos e adicionar novamente vai gerar um delay grande, o melhor seria era recuperar do banco e atualiza só a linha que vc quer, assim não precisa excluir todas as linhas, mas no seu caso acredito que jtable não vai ter muitos registros.

Jacob, na verdade não sei muito bem usar esse conceito, pois tambem acredito que terei que fazer uma AbstractModel para este tipo de exemplo, não?

  • Quanto a quantidade de dados acredito q nunca passe de 20 linhas na Fila.
    Segue o código do meu Jtable atualizar para ver qual a melhor forma que posso solucionar meu problema. Desde já agradeço sua ajuda.

private void AtualizaFila (){
//INICIO DE CAST DE DATA*********
String dia = dt_ini.getText().substring(0, 2);
String mes = dt_ini.getText().substring(3, 5);
String ano = dt_ini.getText().substring(6);

      String dia1 = dt_final.getText().substring(0, 2);
      String mes1 = dt_final.getText().substring(3, 5);
      String ano1 = dt_final.getText().substring(6); 
    //*********FIM DE CAST DE DATA********************* 
    
    //Conecta ao DB e preenche com o retorno da consulta da Query na Table Fila  
    //Faz uma busca no Table de Manipulação e Table Finalizado, e valida se não há registro duplicado
    //Caso houver remove a linha da Table FILA
    
    if (tb_fila.getRowCount() == 0){ //Preenche a tabela somente se a linha for = a 0
        try {
        conn = conexao.getConnection();
       //Titulos das Colunas da Tabela
       String[]titulos =new String[]{"Reg","Pront","Nome", "Esquema", "Medicamento", "Dose","User_Solic", "Psc_Num","Data_Solic","MNP", "Psc_APM", "Cod_Barra"};
       //Query de consulta  
        String SQL;
           SQL = "SELECT pac.pac_reg, pac.pac_pront, pac.pac_nome, bul.bul_nome, adp.adp_nome, apl.apl_dose,sma.sma_usr_login_sol, sma.sma_data, apl.apl_psc_num, psc.psc_apm, "
                        + " (CAST (psc.psc_pac AS VARCHAR(10)) + CAST (psc.psc_num AS VARCHAR(10)) + CAST (psc.psc_apm AS VARCHAR(10))) as Cod_Barra "
                        + " FROM psc"
                        + " join pac on "
                        + "   ( pac.pac_reg = psc.psc_pac )"
                        + " join apl on"
                        + "   ( apl.apl_psc_hsp = psc.psc_hsp ) and"
                        + "   ( apl.apl_psc_num = psc.psc_num ) and"
                        + "   ( apl.apl_psc_pac = psc.psc_pac )"
                        + " join apm on"
                        + "   ( apm.apm_pac = psc.psc_pac ) and"
                        + "   ( apm.apm_hsp = psc.psc_hsp ) and"
                        + "   ( apm.apm_num = psc.psc_apm )"
                        + " join sma on"
                        + "   (sma.sma_serie = apm.apm_sma_serie) and"
                        + "   (sma.sma_num   = apm.apm_sma_num)"
                        + " join bul on"
                        + "   (bul.bul_med = psc.psc_cod)"
                        + " join adp on"
                        + "   (adp.adp_cod = psc.psc_adp)"
                        + " join cnv on"
                        + "   ( cnv.cnv_cod = pac.pac_cnv )"
                        + " join psv on"
                        + "   ( psc.psc_med = psv.psv_cod )"
                        + " FULL join psv ps on"
                        + "   ( psc.psc_med2 = ps.psv_cod )"
                        + " WHERE"
                        // Retornar as prescrições (Aplicações) do dia
                        + "  apl.apl_dthr_aplic >= '"+ano+"-"+mes+"-"+dia+" 00:00:00' and"
                        + "  apl.apl_dthr_aplic <= '"+ano1+"-"+mes1+"-"+dia1+" 23:59:59' and"
                        // Retornar as Solicações (Enfermagem) do dia     
                        + "  sma.sma_data >= '"+ano+"-"+mes+"-"+dia+" 00:00:00' and"
                        + "  sma.sma_data <= '"+ano1+"-"+mes1+"-"+dia1+" 23:59:59' and"
                        + "  pac.pac_nome not like 'xxx%' and"
                        + "  apl.apl_status in('A','N') And"
                        + "  bul.bul_farm2 = 2 AND bul.bul_farm1 = 62"
                        + " ORDER BY sma.sma_data DESC ";
                       

        model =new DefaultTableModel(null, titulos);

        sent = conn.createStatement();
        ResultSet rs = sent.executeQuery(SQL);

        String []fila = new String[12];

        while (rs.next()){
                
            fila [0]=rs.getString("pac_reg");
            fila [1]=rs.getString("pac_pront");
            fila [2]=rs.getString("pac_nome");
            fila [3]=rs.getString("adp_nome");
            fila [4]=rs.getString("bul_nome");
            fila [5]=rs.getString("apl_dose");
            fila [6]=rs.getString("sma_usr_login_sol");
            fila [7]=rs.getString("apl_psc_num");
            fila [8]=rs.getString("sma_data");
            fila [9]=null;//Inicia a variavel vazia
            fila [10] =rs.getString("psc_apm");
            fila [11] =rs.getString("Cod_Barra");
            
            //For para validar registro FILA igual a tabela Em Manipulação
            for ( int m = 0; m < tb_manip.getRowCount() ; m++)
               {
                 if (fila [0].equals(tb_manip.getValueAt(m, 0)) && fila [7].equals(tb_manip.getValueAt(m, 11))&& fila [10].equals(tb_manip.getValueAt(m, 12)))
                     {
                     fila [9]="EMNP";
                     }
               }
            //For para validar registro FILA igual a tabela Finalizado
            for ( int f = 0; f < tb_fim.getRowCount() ; f++)
               {
                 if (fila [0].equals(tb_fim.getValueAt(f, 0)) && fila [7].equals(tb_fim.getValueAt(f, 12)) && fila [10].equals(tb_fim.getValueAt(f, 13)))
                     {
                     fila [9]="MNP";
                     }
               }
              
              model.addRow(fila); 
              
        }
        conn.close();
        tb_fila.setModel(model);
        tb_fila.setDefaultEditor(Object.class, null);
        //Colunas que deverão ser ocultadas e ajustadas o tamanho
        tb_fila.setAutoResizeMode(javax.swing.JTable.WIDTH );
        tb_fila.getColumnModel().getColumn(0).setMinWidth(0);
        tb_fila.getColumnModel().getColumn(0).setMaxWidth(0);
        tb_fila.getColumnModel().getColumn(1).setMinWidth(60);
        tb_fila.getColumnModel().getColumn(1).setMaxWidth(60);
        tb_fila.getColumnModel().getColumn(2).setMinWidth(200);
        tb_fila.getColumnModel().getColumn(2).setMaxWidth(200);
        tb_fila.getColumnModel().getColumn(5).setMinWidth(60);
        tb_fila.getColumnModel().getColumn(5).setMaxWidth(60);
        tb_fila.getColumnModel().getColumn(6).setMinWidth(80);
        tb_fila.getColumnModel().getColumn(6).setMaxWidth(80);
        tb_fila.getColumnModel().getColumn(7).setMinWidth(0);
        tb_fila.getColumnModel().getColumn(7).setMaxWidth(0);
        tb_fila.getColumnModel().getColumn(8).setMinWidth(150);
        tb_fila.getColumnModel().getColumn(8).setMaxWidth(150);
        tb_fila.getColumnModel().getColumn(9).setMinWidth(0);
        tb_fila.getColumnModel().getColumn(9).setMaxWidth(0);
        tb_fila.getColumnModel().getColumn(10).setMinWidth(0);
        tb_fila.getColumnModel().getColumn(10).setMaxWidth(0);
        //Selecionar somente uma linha por vez
        tb_fila.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
       
        }catch (SQLException ex){
            JOptionPane.showMessageDialog(this, "Erro na Consulta ao Banco Smart!", "Erro",JOptionPane.ERROR_MESSAGE);
            JOptionPane.showMessageDialog(this, ex);
        }catch (Exception e){
            JOptionPane.showMessageDialog(this, e);
          }
        
             //Valida se o valor adicionado já existe na Tabela Finalizado
             //Se existe, remove da Tabela linha, para não gerar duplicidade
                for ( int f = tb_fila.getRowCount()-1; f >=0; f--)//Decrementa contador devido ao Array iniciar com 0
                 {
                   if (tb_fila.getValueAt(f, 9) == ("MNP") || tb_fila.getValueAt(f, 9) == ("EMNP"))//Remove da FILA os já Manipulados
                     {
                     model.removeRow(f);
                     }
                 }//Finaliza o FOR para Tabela Finalizado   
        }//Finaliza o IF para Tabela Finalizado   
}//Encerra Classe Atualiza();

Este é meu código, consegue me ajudar?

@jacoboliveira

Preferi seguir um de seus conselhos e até mesmo facilitar minha vida já que o DefaultTableModel, não deixa muita facilidade ou opções para alguns tipos de logicas que precisamos.
Preferi ir pelo método que me deu opção, que foi Manter os dados na Fila e remover somente a linha que vou trabalhar, sem utilizar o método filtro que estava me dando dor de cabeça.
Segue como solucionei meu caso:
–> Usando o campo busca, criei uma forma de varrer a tabela e localizar a coluna codigo de barra de acordo com o digitado pelo usuário, e depois seleciona a linha encontrada. Dando assim opções de forma para executar os outros métodos

private void procuraTableFila(String codbarra){
int tamanho = codbarra.length()-12;
for (int linha = 0; linha < tb_fila.getRowCount(); linha++){
String filaTable = (String) tb_fila.getValueAt(linha, 11);
if (filaTable.substring(tamanho).equals(codbarra)){
tb_fila.setRowSelectionInterval(linha,linha);
txt_cod_barra.setText(null);
}
}
}

—>> Depois utilizo o codigo no campo de CodigodeBarra onde chamo os outros metodos

private void txt_cod_barraKeyReleased(java.awt.event.KeyEvent evt) {
// Declarando variavel para o metodo e vincula o campo texto
// Chama o metódo que busca na table a string digitada
String codbarra = txt_cod_barra.getText();
int ptab = tp_all.getSelectedIndex();//Armazena a posição da Aba Selecionada
//Se aba estiver na posição 0 executa esta condição:
if (ptab == 0 && evt.getKeyCode() == KeyEvent.VK_ENTER){
procuraTableFila(codbarra);
Manipular();
tb_manip.setRowSelectionInterval(0,0);
AtualizaEmManipulacao();
Sinal();
}}

Muito obrigado pela ajuda para solucionar parte do meu problema.

1 curtida