JTable e JTextField = muitas duvidas!

9 respostas
ricardoal
Alo garela eu sou iniciante em java a 6 meses, esto criando um sistema de cadastro na IDE NetBeans 7.1.1, eu fiz a tabela se conectar com o bd e dois TextField um de nome e outro de código, criei outro TextField para consulta dos fornecedores Imagem da tela [img]https://lh6.ggpht.com/CLRbz0hfyhQRGw4D-sWWx0T52FoHl1m680kFC49dr35GMY86_ZNRHUpFAYrMAbEPwh-26Q=s102[/img] Aqui ta o código do evento ActionPerformed para TextField de busca
try {
            conCadFornecedor.resultset.first();
            String igual = "n";
            int tamanho_pesquisa = edtPesquisa.getText().length();
            while ("n".equals(igual)) {
                String pesquisado = conCadFornecedor.resultset.getString("nome").substring(0, (tamanho_pesquisa));
                    if (pesquisado.equals(edtPesquisa.getText())){
                        igual = "s";
                    }
                    else
                        conCadFornecedor.resultset.next();
            }
            edtCodigo.setText(conCadFornecedor.resultset.getString("codigo"));
            set_linha();
            edtNome.setText(conCadFornecedor.resultset.getString("nome"));
        }
        catch(SQLException erro) {
            JOptionPane.showMessageDialog(null, "Não Conseguiu localizar Via Digitação");
        }
eu queria que quando eu digitar o nome do fornecedor e apertasse Enter o jTable no casso o tblFornecedor de um getSelectRow na linha onde esteja o valor de código. se nessesario aqui ta o código do jtable
public void preencher_Jtable() {   //Funcionario
               tblConFornecedor.getColumnModel().getColumn(0).setPreferredWidth(50);
               tblConFornecedor.getColumnModel().getColumn(1).setPreferredWidth(80);
               tblConFornecedor.getColumnModel().getColumn(2).setPreferredWidth(200);
               tblConFornecedor.getColumnModel().getColumn(3).setPreferredWidth(100);
               tblConFornecedor.getColumnModel().getColumn(4).setPreferredWidth(150);
               tblConFornecedor.getColumnModel().getColumn(5).setPreferredWidth(100);
               tblConFornecedor.getColumnModel().getColumn(6).setPreferredWidth(100);
               tblConFornecedor.getColumnModel().getColumn(7).setPreferredWidth(100);
               tblConFornecedor.getColumnModel().getColumn(8).setPreferredWidth(90);
               tblConFornecedor.getColumnModel().getColumn(9).setPreferredWidth(100);
               tblConFornecedor.getColumnModel().getColumn(10).setPreferredWidth(80);
               tblConFornecedor.getColumnModel().getColumn(11).setPreferredWidth(25);
               tblConFornecedor.getColumnModel().getColumn(12).setPreferredWidth(90);
               tblConFornecedor.getColumnModel().getColumn(13).setPreferredWidth(150);
               tblConFornecedor.getColumnModel().getColumn(14).setPreferredWidth(100);//Fornecedor
               tblConFornecedor.getColumnModel().getColumn(15).setPreferredWidth(90);
               tblConFornecedor.getColumnModel().getColumn(16).setPreferredWidth(90);
               tblConFornecedor.getColumnModel().getColumn(17).setPreferredWidth(90);
               tblConFornecedor.getColumnModel().getColumn(18).setPreferredWidth(90);
               tblConFornecedor.getColumnModel().getColumn(19).setPreferredWidth(90);
               tblConFornecedor.getColumnModel().getColumn(20).setPreferredWidth(90);
               tblConFornecedor.getColumnModel().getColumn(21).setPreferredWidth(90);              
               modelo = (DefaultTableModel)tblConFornecedor.getModel();                    
               modelo.setNumRows(0);                 
               try {
        
                   
                   while (conCadFornecedor.resultset.next()){
                       modelo.addRow(new Object[]{
                           conCadFornecedor.resultset.getString("codigo"),
                           conCadFornecedor.resultset.getString("Data"),
                           conCadFornecedor.resultset.getString("Nome"),
                           conCadFornecedor.resultset.getString("Nfantasia"),
                           conCadFornecedor.resultset.getString("grupo"),
                           conCadFornecedor.resultset.getString("endereco"),
                           conCadFornecedor.resultset.getString("bairro"),
                           conCadFornecedor.resultset.getString("num"),
                           conCadFornecedor.resultset.getString("comp"),
                           conCadFornecedor.resultset.getString("cidade"),
                           conCadFornecedor.resultset.getString("cep"),
                           conCadFornecedor.resultset.getString("uf"),
                           conCadFornecedor.resultset.getString("pais"),
                           conCadFornecedor.resultset.getString("telefone"),                           
                           conCadFornecedor.resultset.getString("celular"),
                           conCadFornecedor.resultset.getString("fax"),
                           conCadFornecedor.resultset.getString("site"),
                           conCadFornecedor.resultset.getString("inscricaoE"),
                           conCadFornecedor.resultset.getString("inscricaoM"),
                           conCadFornecedor.resultset.getString("inss"),
                           conCadFornecedor.resultset.getString("cnpj")                           
                    });
                  }                    
               }
               catch (SQLException erro){
                   JOptionPane.showMessageDialog(null,"Erro ao listar os campos erro: " +erro);
               }
           }
e tabem o código de mostra os valores de EdtNome e EdtCodigo
try {            
            conCadFornecedor.resultset.first();                                  
            edtCodigo.setText(conCadFornecedor.resultset.getString("codigo"));        
            edtNome.setText(conCadFornecedor.resultset.getString("nome"));            
           
        }
    catch(SQLException erro) {
            JOptionPane.showMessageDialog(null, "Não foi posivel conectar aos dados erro: "+ erro);
        }
eu do muitisimo obrigado a você que me ajudar, e espero ajudar as pessoas que pesquisa no forum GUJ Obrigado!!!

9 Respostas

SandroSoftwares
eu queria que quando eu digitar o nome do fornecedor e apertasse Enter o jTable no casso o tblFornecedor de um getSelectRow na linha onde esteja o valor de código.
ricardoal, eu faço assim: (coloco esse método abaixo no código e chamo-o dentro do actionPerformed do botão.

tendo um textfield onde digito o dado a ser pesquisado, um botão para ativar a pesquisa e uma tabela onde o dado será pesquisado:

private void encontraDadosNaTabela(String dado) { // dado aqui é o textfield.getText()
        int qtLinhas = 0;
        try {
            qtLinhas = modelo.getRowCount(); // retorno dessa forma a quantidade de linhas da tabela
        } catch (java.lang.NullPointerException ex) {
            qtLinhas = 0;
        }
        int corredor = 0; //pra ir passando linha por linha até achar o dado...
        int qtContatosLocalizados = 0;


        while (corredor < qtLinhas) {

            String nomeNaTabela = ("" + modelo.getValueAt(corredor, 2)); // 2 aqui é a coluna onde o dado está, lembrando que a contagem começa em ZERO.
            if (nomeNaTabela.equals(dado.toUpperCase().trim())) {
                ++qtContatosLocalizados;
                jTableTelefones.changeSelection(corredor, corredor, false, false); //seleciona se o dado da coluna for igual ao digitado no textfield
            }
            ++corredor;

        }
        if (qtContatosLocalizados == 0) {//nenhum dado localizado
           
            JOptionPane.showMessageDialog(null, "Dado não localizado!\nVerifique se está digitado corretamente!\nSe trata-se de um novo contato pode cadastrá-lo agora!");
          
        } else if (qtContatosLocalizados >= 2) { //há mais de um dado localizado
            JOptionPane.showMessageDialog(null, "Existem " + qtContatosLocalizados + " contatos com o mesmo critério informado!");
        }

    }

no actionPerformed do botão fica:

encontraDadosNaTabela(textField.getText());
jacobis

Cara na boa se você não implementar o listener de teclado, quando você clicar no botão enter não irá acontecer nada. Pra isso temos o :

addKeyListener(new KeyListener() {
					
					@Override
					public void keyTyped(KeyEvent arg0) {
						// TODO Auto-generated method stub
						
					}
					
					@Override
					public void keyReleased(KeyEvent arg0) {
						// TODO Auto-generated method stub
						
					}
					
					@Override
					public void keyPressed(KeyEvent arg0) {
						if(KeyEvent.getKeyText(arg0.getKeyCode()).toUpperCase()=="enter"){
							//faça a ação que voce deseja.
						}
						
					}
				})

Feito isso toda vez que voce clicar em enter ele irá procurar a ação a executar dentro do “if”. Espero ter ajudado…

ricardoal

no caso eu devo por assim

private void edtPesquisaActionPerformed(java.awt.event.ActionEvent evt) { try { conCadFornecedor.resultset.first(); String igual = "n"; int tamanho_pesquisa = edtPesquisa.getText().length(); while ("n".equals(igual)) { String pesquisado = conCadFornecedor.resultset.getString("nome").substring(0, (tamanho_pesquisa)); if (pesquisado.equals(edtPesquisa.getText())){ igual = "s"; } else conCadFornecedor.resultset.next(); } edtCodigo.setText(conCadFornecedor.resultset.getString("codigo")); edtNome.setText(conCadFornecedor.resultset.getString("nome")); encontraDadosNaTabela(edtPesquisa.getText());//eu botei aqui o método e "peguei" o q tava la dentro } catch(SQLException erro) { JOptionPane.showMessageDialog(null, "Não Conseguiu localizar Via Digitação"); } }
como no codigo eu botei no depois do while mais quando apertava enter dava um JOptionPane.showMessageDialog
no caso esse

sim eu errei em posta a foto aki ta ela
quando eu digito e apeto no enter no campo apontado pela seta, os dos campos de baixo o de nome e código aparece o resultado.
SandroSoftwares tem como você me ajudar mais eu sou noob ainda em java.


Cara na boa se você não implementar o listener de teclado, quando você clicar no botão enter não irá acontecer nada. Pra isso temos o :

jacobis obrigado pela dica tbm, mais funciona mesmo assim eu acho que é porque eu to usando NetBeans e não o Eclipce

SandroSoftwares

ricardoal

pelo que tô percebendo: vc está povoando a tabela a medida que pesquisa?

Eu faço o contrário. preencho a tabela com resultset.

Depois de preenchida ai sim eu faço a busca sem precisar me preocupar mais com o resultset (fazendo simplesmente a verificação linha a linha).

método para preencher tabela usando DAO:

public void atualizaJTable() {


        try {
           
            jTableTelefones.getColumnModel().getColumn(0).setPreferredWidth(20);
            jTableTelefones.getColumnModel().getColumn(1).setPreferredWidth(20);

            jTableTelefones.getColumnModel().getColumn(2).setPreferredWidth(200);
            jTableTelefones.getColumnModel().getColumn(3).setPreferredWidth(50);
            jTableTelefones.getColumnModel().getColumn(4).setPreferredWidth(50);
            jTableTelefones.getColumnModel().getColumn(5).setPreferredWidth(50);
            jTableTelefones.getColumnModel().getColumn(6).setPreferredWidth(50);


            //centralizado:
            DefaultTableCellRenderer centro = new DefaultTableCellRenderer();
            centro.setHorizontalAlignment(SwingConstants.CENTER);
            jTableTelefones.getColumnModel().getColumn(0).setCellRenderer(centro);
            jTableTelefones.getColumnModel().getColumn(1).setCellRenderer(centro);
            jTableTelefones.getColumnModel().getColumn(3).setCellRenderer(centro);
            jTableTelefones.getColumnModel().getColumn(4).setCellRenderer(centro);
            jTableTelefones.getColumnModel().getColumn(5).setCellRenderer(centro);
            jTableTelefones.getColumnModel().getColumn(6).setCellRenderer(centro);
            modelo = (DefaultTableModel) jTableTelefones.getModel();
            modelo.setNumRows(0);

            AgendaDao dao = new AgendaDao();

            ResultSet contatos = dao.getContatosCadastrados(); // O código desse método getContatosCadastrados está logo abaixo

            int cont = 0;

            while (contatos.next()) {

                //Aqui você adiciona os campos do banco de dados no jTable.
                modelo.addRow(new Object[]{++cont, contatos.getInt("idcontato"), contatos.getString("nome"), contatos.getString("celular1"), contatos.getString("celular2"), contatos.getString("telefone"), contatos.getString("fax")});


            }
            contatos.close();
            dao.getContatosCadastrados().close();

        } catch (SQLException ex) {
        }

    }

na classe DAO

public class AgendaDao {

    private Connection conexao;

    public AgendaDao() throws SQLException {
        this.conexao = CriaConexao.getConexao();
    }

 public ResultSet getContatosCadastrados() throws SQLException {
        String sql = "Select * from Agenda order by nome";
        PreparedStatement stmt = conexao.prepareStatement(sql);

        ResultSet rs = stmt.executeQuery();
        return rs;

    }

me perdoe se eu compliquei... é que eu não estava entendendo muito bem...
se eu puder ajudar a esclarecer algo dentro das minhas possibilidades tô aqui...

Sandro

SandroSoftwares

bom… já vi que você está preenchendo os dados no jtable antes… foi bobera minha…

agora o que eu estou tentando entender é a lógica.

Se seus dados já tão na jtable é só implementar aquele método que eu te postei no 2º post (criando o botão que lá diz…) e daria certo.

outra opção seria fazer ao invez de criar o botão “pesquisar”, entrar com os eventos de teclado para capturar o enter como o jacobis falou.

Sandro

ricardoal

SandroSoftwares me descupa mais eu acho k to ti confundino,
o comando de digitar o codigo pega, e manda o valores da minha tabela cadfornecedor fusiona tranquilamente e manda para dois jTextField o que eu tbm pesei antes era pegar o k tinha o valor do edtcodigo que ja esta preenchido depois q eu digito o enter e usar um .equals(edtCodigo.getText() e comparar com tblFornecedor.getValuesAT("a linha onde o codigo esta ","aki no é a coluna 0 aki nao tem bronca") o problema é como eu vou abiter o valor da linha e como eu vou usar o tblFornecedor.getSelectRow()pf ta uma luz aiii

SandroSoftwares

pronto:

int linhaSelecionada = tblFornecedor.getSelectRow(); jTextFieldCodigo.setText("" + modelo.getValueAt(linhaSelecionada, 0)); //digamos que o código tá na coluna 0 (que é a primeira) jTextFieldNome.setText("" + modelo.getValueAT(linhaSelecionada, 1)); // digamos que o nome tá na coluna 1 (que é a segunda)

ricardoal
cara eu vou ser um saco pra tu mais esse comando eu usei pra k eu quando clicar em cima de uma linha ela mostre os valores nos campos iso eu sei, é que eu nao consigo explicar direito pow, saka eu consigo conectar a jTable na minha tabela la no MySQL que se chama CadFornecedor ai tudo bem tbm eu mando os valores dos Campos Codigo e Nome para os [color=blue]jTextField edtCodigo [/color] e [color=blue]jTextField edtNome [/color] ai tbm beleza tbm quando eu boto esse comando em jTextField edtPesquisa
private void edtPesquisaActionPerformed(java.awt.event.ActionEvent evt) {                                            
        try {
            conCadFornecedor.resultset.first();
            String igual = "n";
            int tamanho_pesquisa = edtPesquisa.getText().length();
            while ("n".equals(igual)) {
                String pesquisado = conCadFornecedor.resultset.getString("nome").substring(0, (tamanho_pesquisa));
                    if (pesquisado.equals(edtPesquisa.getText())){
                        igual = "s";
                    }
                    else
                        conCadFornecedor.resultset.next();
            }
            edtCodigo.setText(conCadFornecedor.resultset.getString("codigo"));            
            edtNome.setText(conCadFornecedor.resultset.getString("nome"));            
           
        }
        catch(SQLException erro) {
            JOptionPane.showMessageDialog(null, "Não Conseguiu localizar Via Digitação");
        }
    }
que eu vei na vídeo aula do prof Neri. eu aperto enter os valores dos campos la no MySQL de Código e Nome eles vem na moral sem frescura nenhuma. eu to tentando botar um método que eu selecione uma linha depois que eu aperta o enter como la no DBGrid do simples e fácil Delphi 7. exemplo eu boto a Nome do Fornecedor "ManiComp" ele mostra la nos campos código e nome mais não seleciona na tabela . eu vei uma vídeo aula de Neri que ele consegue fazer isso mais é com butão de navegação mais era limitado só ia pra sima e pra baixo primeiro e ultimo sera que tem como fazer um getSelectedRow só com valores de um jTextField e a linha onde os valores estão fique [color=blue]azul[/color]. se tbm falando nisso java é uma linguagem censitive pf SandroSoftwares como converte letras maiúsculas em minusculas virce versa.
M

Eu uso esse método para alternar entre duas tabelas, eu clico em uma e seleciona a linha inteira de outra;

Talvez isso sirva para você;

Essa sua tabela provavelmente está em um JScrollPane;

Então quando você digitar o valor no seu JTextField, faz a pesquisa e recupera qual linha está o campo pesquisado e passa
quando chamar o método “IrParaLinhaSelecionada”;

//Esse "linhaSelecionada" vai ser o valor da linha que está o campo

        public static void IrParaLinhaSelecionada(int linhaSelecionada){
		//Marca linha selecionada
		seuScroll.getVerticalScrollBar().setValue(suaTabela.getRowHeight()*(linhaSelecionada-1));
		//Muda o foco para a tabela
		suaTabela.requestFocus();
		//Seleciona a linha inteira
		suaTabela.setRowSelectionInterval(linhaSelecionada-1,linhaSelecionada-1);  
	}

Espero que ajude;

Criado 18 de agosto de 2012
Ultima resposta 22 de ago. de 2012
Respostas 9
Participantes 4