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

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?

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;

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

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!

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;
}
}

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!

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?

Bom, segue o código completo do JPanel:

[code]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("");
		}
	}
}[/code]
  1. Os resultados apresentados: null
  2. O Java não apresenta erro
  3. O teste com println, retorna a String do JTextField normalmente.

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.

Corrigir esse código fica fácil:

[code]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("");
  }

}
}[/code]

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.

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.