[Resolvido] Passar String do JTextField para uma variável

11 respostas
Paulo_Ferreira1

Boa madrugada!
Dúvida:
Estou tentando passar o texto digitado em um JTextField, para uma String, para usar em um select:

String texto = tfnome.getText(); String query = "SELECT *FROM agenda WHERE nome ='"+texto+"'";
O que está errado?

11 Respostas

chusgrudi

tente assim

String query = "SELECT * FROM TABELA WHERE CAMPO = " + field.getText();
se não me engano ele vem com aspas! não testei, mas se num vier tente isso!

String query = “SELECT * FROM TABELA WHERE CAMPO = “” + field.getText() + “””;

axo que deve te ajudar;

ViniGodoy

O ideal mesmo é usar um prepared statement.

Aí vc deixa sua query assim:

Isso impede também do usuário (um hacker) dizer que o nome é:

E fazer o seu SQL retornar todos os usuários do banco. Mais informações:
http://www.guj.com.br/java.tutorial.artigo.115.1.guj

Paulo_Ferreira1

Bom, já tinha visto algo sobre prepared statement;
Acabei de ler o tutorial indicado, funciona legal, agradeço pela ajuda, mas ainda não consegui que o nome a ser persquisado, seja o texto digitado no JTextFild, esta que é a questão!

R

Veja o exemplo abaixo. Espero que ajude. Eu faço dessa forma.

codigo = empresa.getText();  // aqui eu pego o que foi digitado no JTextField 
Class.forName("org.postgresql.Driver").newInstance();
Connection conexao = DriverManager.getConnection("jdbc:postgresql:postgres","usuario", "senha");
Statement instancia = conexao.createStatement();
ResultSet rs = instancia.executeQuery("SELECT codigo, razao FROM empresas");
while(rs.next())
{
if(rs.getString("codigo").equals(codigo)) // aqui é feito a procura sobre o que o usuário digitou no campo texto.
{
ResultaEmpresa.setText(rs.getString("razao"));
achouEmpresa = true;
conexao.close();
break;
}
else
{
achouEmpresa = false;
}
}
Paulo_Ferreira1

Estou fazendo assim, mas não funciona:

PreparedStatement pstmt = conexao.prepareStatement("SELECT *FROM agenda WHERE nome =?"); pstmt.setString(1,""+tfnome.getText()); rs = pstmt.executeQuery();
O texto digitado no JtextField não é passado!

ViniGodoy

Você tem certeza que tfNome e o seu JTextField se referem ao mesmo objeto?
Já tentou dar um println em tfnome.getText() para ver se o conteúdo do JTextField é impresso?

Um erro comum é vc adicionar o JTextField no panel e depois dar um novo new na variável que deveria representa-lo. Aí vc acaba com uma variável que nada tem a ver com o JTextField que está mesmo na tela. Confere aí no seu código se não existe nenhum outro new dado por acidente.

A mecânica, pelo menos desse trecho que vc mostrou para gente, está certa. O erro está em outro lugar.

Ah, e não precisa fazer “”+tfnome.getText().
Só o tfnome.getText() direto serve. :wink:

Outra coisa… não está faltando espaço entre o * e o FROM? E o Java dá alguma mensagem de erro, ou ele simplesmente não retorna nada?

Paulo_Ferreira1
Bom, segue o código completo do JPanel:
public class Localizar extends JPanel implements ActionListener {
	
	JLabel jlborda,jlnome;	
	JButton btlocalizar,btlimpar;	
	JTextField tfnome;
    JTextArea taresultado;
    String n,tr,tc,em;
    ResultSet rs;
    Statement State;
    
	public Localizar() {
		setBackground(new Color(79,148,205));
		setLayout(null);
		
		jlborda = new JLabel();
		jlborda.setBounds(5,25,385,238);
		jlborda.setBorder(BorderFactory.createLineBorder(Color.white,2));
		
		jlnome = new JLabel("Nome :");
		jlnome.setBounds(22, 35, 50, 20);
		jlnome.setForeground(Color.white);
		
		tfnome = new JTextField();
		tfnome.setBounds(65, 35, 208, 20);
		tfnome.setBorder(BorderFactory.createLineBorder(new Color(65, 105,225), 1));
							
		btlocalizar = new JButton("Localizar");
		btlocalizar.setBounds(275,35,100,20);
		btlocalizar.setBackground(Color.white);
		btlocalizar.setFocusable(false);
		btlocalizar.addActionListener(this);
				
		taresultado = new JTextArea();
		taresultado.setBounds(22, 67, 352, 153);
		taresultado.setBorder(BorderFactory.createLineBorder(Color.black,1));
		taresultado.setOpaque(true);
		taresultado.setBackground(Color.white);
		taresultado.setEditable(false);
		taresultado.setFont(new Font("Arial",Font.PLAIN,13));
		
		btlimpar = new JButton("Limpar");
		btlimpar.setBounds(275,230,100,20);
		btlimpar.setBackground(Color.white);
		btlimpar.setFocusable(false);
		btlimpar.addActionListener(this);			
		
		add(tfnome);
		add(jlborda);
        add(jlnome);	
		add(taresultado);
    	add(btlocalizar);
    	add(btlimpar);
    	    
//---------------------------------------------------------------------------------------------------    	
	
    	String url = "jdbc:odbc:AgendaJava";
	        try
	          {
	          Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
	          Connection conexao = DriverManager.getConnection(url);
	          PreparedStatement pstmt = conexao.prepareStatement("SELECT * FROM agenda WHERE nome =?");       
	          pstmt.setString(1,tfnome.getText()); // se passar a String, no lugar do tfnome.getText(), funciona normalmente.
	          rs = pstmt.executeQuery(); 
	         
	          while(rs.next()){
	          n  = rs.getString("nome");
              tr = rs.getString("telres");
              tc = rs.getString("telcel");
              em = rs.getString("email");
              break;
	          }
	          conexao.close();
	          }
	        catch(ClassNotFoundException ex)
	          {
	          System.out.println("Driver JDBC-ODBC não encontrado!");
	          }
	        catch(SQLException ex)
	          {
	          System.out.println("Problemas na conexao com a fonte de dados");
	          } 
	}
	
	public void actionPerformed(ActionEvent e) {
		
		if(e.getSource()==(btlocalizar)){
			if (tfnome.getText().equals("")) {
				taresultado.setText("");
			}
			else{
			taresultado.setText("\n Nome  : "+n
					    +"\n\n"+" Tel cel : "+tc
						+"\n\n"+" Tel res : "+tr
						+"\n\n"+" e-mail  : "+em);
			}
		}
		if(e.getSource()==btlimpar){
			tfnome.setText("");
			taresultado.setText("");
			}
		}
	}
1) Os resultados apresentados: null 2) O Java não apresenta erro 3) O teste com println, retorna a String do JTextField normalmente.
ViniGodoy

Peraí, tem alguma coisa errada. Esse é o código todo?

Se for, você está rodando a consulta no construtor, e não está rodando consulta nenhuma durante a ação do botão.

Isso está errado. Durante o construtor, você dá os news em todos os componentes do form e os posiciona.
No botão de consulta, você roda a consulta, pega o resultado, e seta no JTextField.

A consulta e o JTextField não ficam vinculados para sempre.

ViniGodoy

Corrigir esse código fica fácil:

public class Localizar extends JPanel implements ActionListener {
   JLabel jlborda,jlnome;	
   JButton btlocalizar,btlimpar;	
   JTextField tfnome;
   JTextArea taresultado;
   String n,tr,tc,em;
   ResultSet rs;
   Statement State;
    
   public Localizar() {
      setBackground(new Color(79,148,205));
      setLayout(null);
		
      jlborda = new JLabel();
      jlborda.setBounds(5,25,385,238);
      jlborda.setBorder(BorderFactory.createLineBorder(Color.white,2));
		
      jlnome = new JLabel("Nome :");
      jlnome.setBounds(22, 35, 50, 20);
      jlnome.setForeground(Color.white);
		
      tfnome = new JTextField();
      tfnome.setBounds(65, 35, 208, 20);
      tfnome.setBorder(BorderFactory.createLineBorder(new Color(65, 105,225), 1));
							
      btlocalizar = new JButton("Localizar");
      btlocalizar.setBounds(275,35,100,20);
      btlocalizar.setBackground(Color.white);
      btlocalizar.setFocusable(false);
      btlocalizar.addActionListener(this);
				
      taresultado = new JTextArea();
      taresultado.setBounds(22, 67, 352, 153);
      taresultado.setBorder(BorderFactory.createLineBorder(Color.black,1));
      taresultado.setOpaque(true);
      taresultado.setBackground(Color.white);
      taresultado.setEditable(false);
      taresultado.setFont(new Font("Arial",Font.PLAIN,13));
		
      btlimpar = new JButton("Limpar");
      btlimpar.setBounds(275,230,100,20);
      btlimpar.setBackground(Color.white);
      btlimpar.setFocusable(false);
      btlimpar.addActionListener(this);			
		
      add(tfnome);
      add(jlborda);
      add(jlnome);	
      add(taresultado);
      add(btlocalizar);
      add(btlimpar);
   }

   //Separe o método de busca
   public void procura() {
      String url = "jdbc:odbc:AgendaJava";
      try {
         Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
         Connection conexao = DriverManager.getConnection(url);
         PreparedStatement pstmt = conexao.prepareStatement("SELECT * FROM agenda WHERE nome =?");       
         pstmt.setString(1,tfnome.getText()); // se passar a String, no lugar do tfnome.getText(), funciona normalmente.
         rs = pstmt.executeQuery(); 
	         
         if (rs.next()){
            n  = rs.getString("nome");
            tr = rs.getString("telres");
            tc = rs.getString("telcel");
            em = rs.getString("email");
            break;
         }
         conexao.close();
      } catch(ClassNotFoundException ex) {
         System.out.println("Driver JDBC-ODBC não encontrado!");
         ex.printStackTrace(); //Nunca ignore exceções! Elas te dizem o que aconteceu!
      } catch(SQLException ex) {
         System.out.println("Problemas na conexao com a fonte de dados");
         ex.printStackTrace(); //Nunca ignore exceções! Elas te dizem o que aconteceu!
      } 
   }

   public void actionPerformed(ActionEvent e) {
      if(e.getSource()==(btlocalizar)){
         if (tfnome.getText().equals("")) {
            taresultado.setText("");
            return;
         }

         procura(); //Aqui vc chama o método de busca
         taresultado.setText("\n Nome  : "+ n
            +"\n\n"+" Tel cel : "+tc
            +"\n\n"+" Tel res : "+tr
            +"\n\n"+" e-mail  : "+em);
      }

      if(e.getSource()==btlimpar){
         tfnome.setText("");
         taresultado.setText("");
      }
   }
}
ViniGodoy

Algumas outras dicas:

  1. Você deve ter uma classe para representar um contato dentro da agenda. Faça o método de busca retornar um objeto dessa classe, ao invés de definir um monte de pequenas variáveis;
  2. Se for manter as variáveis, dê nome descritivo para elas. Não vale a pena poupar a digitação de poucos caracteres. É melhor manter o programa legível;
  3. Jamais ignore exceções, a menos que você tenha certeza que tratou o erro adequadamente. Na pior das hipóteses, salve a exceção num arquivo de log.
  4. Sempre feche a conexão e o statement num bloco finally. Isso está faltando no seu programa. A maneira mais fácil de corrigir é inserindo um bloco try finally dentro daquele seu try catch.
Paulo_Ferreira1

Resolvido!
Funcionou 100%.
Obrigado pela ajuda, não tenho mais dúvida que o Guj é um fórum diferenciado, por conseguir reunir participantes que aderiram ao plausível ideal de compartilhar o conhecimento.
Obrigado pelo empenho e principalmente pelas dicas, são de grande valia para mim e, enfim . . .
Continuo ai, aprendendo sempre . . .
Abr.

Criado 29 de junho de 2008
Ultima resposta 30 de jun. de 2008
Respostas 11
Participantes 4