Limpar / diminuir código

Amigos, boa noite! Sou novo aqui no fórum e na linguagem Java. Estou desenvolvendo uma pequena aplicação e resolvi fazer um formulário único de pesquisa para as diversas tabelas.
O código está funcionando direitinho, ele faz a busca e retorna o resultado com base na tabela escolhida.
O problema é que o código está ficando muito grande (são mais ou menos 10 tabelas a serem consultadas) e com várias coisas repetidas.
Segue o código que mostra os dados em uma jTable. Este código está na minha ViewPesquisa. Este código é da pesquisa de apenas uma das tabelas. Multiplicar isso por 10 seria loucura.
Há alguma forma de otimizar?

//PREENCHE TABELA COM OS DADOS
public void preenchetabelafiltro (String text) {
    
    DefaultTableModel tabela = (DefaultTableModel) jTableResultado.getModel();
    cadclienteDAO pcdao = new cadclienteDAO();
    tabela.setNumRows(0);
    
    //PERCORRE A LISTA PARA IR PREENCHENDO
    for(cadclienteBean bp: pcdao.filtrocliente(jTextFieldTexto.getText())) {
        
        //FORMATA A DATA
        Date minhaData = bp.getCliente_dt_nasc();
        SimpleDateFormat formato = new SimpleDateFormat("dd/MM/yyyy");
        String data_formatada = formato.format(minhaData);
    
        tabela.addRow(new Object[]{
        
        bp.getId_cliente(),
        bp.getCliente_cpf(),
        bp.getCliente_nome(),
        data_formatada,
        });        
        
    }
    
}



//FAZ O FILTRO A MEDIDA QUE USUÁRIO DIGITA O NOME
private void jTextFieldTextoKeyReleased(java.awt.event.KeyEvent evt) {                                            
    
    if(jLabelChamada.getText() == "Consulta cliente"){ //CONSULTA TABELA DE CLIENTES
        
        Object[] columnName = {"Ident.","CPF","Nome","Data nasc."};
        jTableResultado.setModel(new DefaultTableModel(columnName, 0) {
        @Override
            public boolean isCellEditable(int row, int column){
            return false;
            }
        });
        
            jTableResultado.getColumnModel().getColumn(0).setPreferredWidth(60);
		jTableResultado.getColumnModel().getColumn(1).setPreferredWidth(100);
		jTableResultado.getColumnModel().getColumn(2).setPreferredWidth(220);
		jTableResultado.getColumnModel().getColumn(3).setPreferredWidth(80);
            preenchetabelafiltro(jTextFieldTexto.getText());
            
    }
    
} 

Se alguém puder me dar uma ajuda, o que devo estudar, onde procurar ou como limpar e otimizar o código.

Muito obrigado!

1 curtida

Vc está usando apenas uma View(formulario) para exibir dados de varias tabelas??

1 curtida

1o Não use o DefaultTableModel

https://www.devmedia.com.br/implementando-seu-proprio-tablemodel/31865

2o Crie uma classe Formulario (exemplo FormularioDeUsuario ou UserForm) ou ModeloDaTelaTal, depende do caso ou gosto:

class ModeloDaTelaTal {
  TabelaDeClientesPF tabelaDeClientesPF; // TabelaDeClientesPF extends AbstractTableModel
  TabelaDeClientesPJ tabelaDeClientesPJ;
  TabelaDeVendas tabelaDeVendas;
}

3o Na Tela:

class TelaTal extends JFrame {
  ModeloDaTelaTal modelo;
  Controle controle;
  JTable clientesPFTable;
  JTable clientesPJTable;
  JTable vendasTable;
  TelaTal() {
    initComponents();
    modelo = new ModeloDaTelaTal();
    clientesPFTable.setTableModel(modelo.obterTabelaDeClientesPF());
  }
  void filtrarPF() {
    String filtro = obterFiltro(); // equvalente get, evite usar jTextField.getText diretamente.
    List<Cliente> lista = controle.obterClientesPFPorFiltro(filtro);
    modelo.obterTabelaDeClientesPF().atualizar(lista);
  }
}

4o Crie uma classe de Controle:

class Controle {
  cadclienteDAO pcdao;
  Controle() {
    pcdao = new cadclienteDAO();
  }
  List<Cliente> obterClientesPFPorFiltro(filtro) {
    return pcdao.filtrocliente(filtro);
  }
}
1 curtida

Obrigado pela resposta!

Vou dar uma estudada nessas coisas que você passou. Tentei fazer algumas, não consegui, mas deve ser falta de conhecimento mesmo. Preciso estudar mais.
Tentei algumas outras coisas, outras partes do sistema e também tive alguma dificuldade. Aos poucos, buscando material e tirando dúvidas, devo conseguir fazer algo.
Obrigado mais uma vez!

Outra sugestão mais simples, use classes para separar os métodos, exemplo:

class Alfabeto {
  void fazA() {
    // 100l inhasde código
  }
  void fazB() {
    // 100 linhas de código
  }
  void fazC() {
    // 100 linhas de código
  }
  /* .............. */
  void fazZ() {
    // 100linha de código
  }
}

daria para separar assim:

class Vogais {
  void fazA() {
    // 100l inhasde código
  }
  /* .............. */
  void fazU() {
    // 100l inhasde código
  }
}

class Consoantes{
  void fazB() {
    // 100l inhasde código
  }
  /* .............. */
  void fazZ() {
    // 100l inhasde código
  }
}

class Alfabeto {
  Vogais vogais = new Vogais();
  Consoantes consoantes = new Consoantes();
  void fazA() {
    vogais.fazA();
  }
  void fazB() {
    consoantes.fazB();
  }
  void fazC() {
    consoantes.fazC();
  }
  /* .............. */
  void fazZ() {
    consoantes.fazZ();
  }
}

neste mesmo exemplo poderia também separar individualmente os métodos:

class LetraA {
  void executar();
}
class LetraB {
  void executar();
}

class Alfabeto {
  void fazA() {
    letraA.executar();
  }
}