Acção no botao

Boas pessoal,

Tenho na minha jframe um campo de texto e um botão.
O estado do botao é JBUtton.setEnable(False) e eu gostaria de acrescentar um actionlistener ao campo de texto para que quando eu colocasse o cursor no campo de texto e digitasse uma letra qualquer ele me passasse o JButton para o estado de setEnable(true).

Ou seja o botao so fica disponivel se houver um digito qualquer no campo de texto.

Alguem me poderia dar um trecho de codigo de como fazer isso acontecer ?

Obrigado

Bom dia Luis blz?

Testa esse código aqui

import javax.swing.*;
import java.awt.event.*;
import java.awt.*;


public class TestAction extends JFrame {
	
	JTextField field;
	JTextField field2;
	JButton button;
	
	public TestAction() {
		super("Testing Action");
		setSize(200,200);
		setLayout( new FlowLayout());
		initComponents();
		pack();
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setVisible(true);
		
	}
	
	public void initComponents() {
		
		field = new JTextField(20);
		field2 = new JTextField(20);
		
		button = new JButton("Teste");
		button.setVisible(false);
			
	    field2.addKeyListener( new KeyListener() {
	    	public void keyPressed(KeyEvent e) {
	    		button.setVisible(true);
	    		pack();
	    	}
	    	
	    	public void keyTyped(KeyEvent e) {}
	    	public void keyReleased(KeyEvent e) {}
	    });
				
		getContentPane().add(field);
		getContentPane().add(field2);
		getContentPane().add(button);
		
	}
	
	public static void main(String[] args) {
		
		TestAction action = new TestAction();
	}
}

Espero que ajude

[ ] 's

O jeito mais apropriado:

[code]
public static void main( String[] args )
{
JFrame frame = new JFrame();
frame.setSize( 400, 400 );
frame.setLayout( new FlowLayout() );
frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );

final JButton button = new JButton( "test" );
button.setEnabled( false );

final JTextField field = new JTextField();
field.setPreferredSize( new Dimension( 200, 20 ) );
field.setDocument( new PlainDocument()
{
	@Override
	protected void insertUpdate( DefaultDocumentEvent chng, AttributeSet attr )
	{
		super.insertUpdate( chng, attr );
		button.setEnabled( field.getText().trim().length() > 0 );
	}

	@Override
	protected void removeUpdate( DefaultDocumentEvent chng )
	{
		super.removeUpdate( chng );
		button.setEnabled( field.getText().trim().length() > 1 );
	}
});

frame.add( field );
frame.add( button );

frame.setVisible( true );

}[/code]

Assim se o campo de texto voltar a ser vazio o botão é desabilitado novamente.

E pelo amor de Zahl, adapte o código para poder ser reutilizado em seu ambiente. Pode, no mínimo, criar uma classe NotNullDocument.

Há alguns problema no código que o nandobgi postou:

  1. Se vc apertar qualquer tecla (isso inclui teclas que não digitam caractere algum no campo de texto, como “F11”, “Backspace”, etc), o programa já mostra(ou habilita) o botão.
  2. Se, depois de escrever algo no campo de texto, vc apagar tudo, o botão continua sendo exibido.
    .
    Isso ocorreu porque essa situação não é apropriadamente tratada com o KeyListener. Uma solução que acho um pouco melhor seria através de um DocumentListener.
    Por trás de um JTextField há sempre um objeto Documment, que serve de modelo de componentes de texto para o swing (Consulte a API). Voce pode obter o Document atrelado ao JTextField e adicionar a ele um DocumentListener, que tem métodos mais apropriados para resolver o lance da habilitação do botão.
    Dê uma olhada nesse exemplo
public class ActionTest{
	public void testButtonBlockerForJTextField(){
		JFrame frame = new JFrame();
		frame.setTitle("Teste");
		frame.setSize(300, 85);
		frame.setDefaultCloseOperation(JDialog.EXIT_ON_CLOSE);
		frame.addWindowListener(
			new WindowAdapter() {
				public void windowClosed(WindowEvent e) {
					System.exit(0);
				}
			}
		);
		
		JButton btn = new JButton("Teste");
		btn.setEnabled(false);
		btn.addActionListener(
			new ActionListener() {
				public void actionPerformed(ActionEvent e) {
					System.exit(0);
				}
			}
		);

		JTextField t = new JTextField();
		t.getDocument().addDocumentListener(
			new ToggleButtonOnTextPresenceListener(t, btn)
		);

		Container app = frame.getContentPane();
		app.setLayout(new BorderLayout());
		app.add(t, BorderLayout.CENTER);
		app.add(btn, BorderLayout.SOUTH);

		frame.setVisible(true);
	}

	public static void main(String[] args) {
		Testes app = new Testes();
		app.testButtonBlockerForJTextField();
	}


	public class ToggleButtonOnTextPresenceListener implements DocumentListener{
		private JButton target;
		private JTextField source;
		
		public ToggleButtonOnTextPresenceListener(JTextField source, JButton target) {
			if(source == null || target == null)
				throw new NullPointerException();
			this.source = source;
			this.target = target;
		}
		
		public void changedUpdate(DocumentEvent e) {
			/*Do nothing*/
		}
		public void insertUpdate(DocumentEvent e) {
			enableButton();
		}
		public void removeUpdate(DocumentEvent e) {
			enableButton();
		}
		private void enableButton() {
			target.setEnabled(source.getText().trim().length() > 0);
		}
	}
}

Qualquer dúvida, pergunte, ok?

EDIT
O Lipe mandou muito bem sobre o lance de reaproveitar uma classe NotNullDocument!!!