FocusListener - duvida

2 respostas
thiagolopes

Boa Noite amigos1

Estou precisando fazer com que assim que um componente(JTextField ou JPasswotdField) tenha o focus faça alguma açao, a minha ideia foi criar um handle que implemente o ActionListener e o FocusListener para tratar alguns enventos conforme o codigo abaixo:

Obs: Criei um handle para os componentes a fim de que assim que o ouvinte receber um evento faça alguma coisa;

package Menu;

import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
import javax.swing.SwingConstants;

import sun.applet.Main;

import java.awt.event.ActionEvent;
import java.awt.event.ActionEvent;

public class TextFieldFrame extends JFrame {

	private JTextField textField1; // campo de texto com tamnho configurado
	private JTextField textField2; // campo de texto construido com texto
	private JTextField textField3; // campo de texto com texto e tamanho
	private JPasswordField passwordField; // campo de senha com texto
	private JLabel label1;

	public TextFieldFrame() {
		super("Testando JTextField e JPasswordField");
		setLocation(250, 300);
		setLayout(new FlowLayout()); // configura o layout de frame

		label1 = new JLabel("Por favor, Coloque seu nome:");
		label1.setToolTipText("Nome");
		add(label1);
		// constrói textField1 com 10 colunas
		textField1 = new JTextField(10);
		add(textField1); // adiciona textField1 ao JFrame

		// Constrói textField2 e Define o texto padrão que sera exibido em
		// textField2
		textField2 = new JTextField("Informe um Texto Qualquer");
		add(textField2);

		// constrói textField3 com o texto padrão e 21 colunas
		textField3 = new JTextField("Desativado Text Field", 21);
		textField3.setEditable(false); // desativa a edição
		textField3.setFocusable(false);
		add(textField3);

		// constrói passwordField com o texto padrão
		passwordField = new JPasswordField("Texto Escondido");
		add(passwordField);

		TextFieldHandler handler = new TextFieldHandler();
		textField1.addActionListener(handler);
		textField2.addActionListener(handler);
		textField3.addActionListener(handler);
		passwordField.addActionListener(handler);

	}

	private class TextFieldHandler implements ActionListener, FocusListener {

		// Este evento irá acontecer quando o componente tiver o focus
		public void focusGained(FocusEvent ganhoDeFocus) {
			if (ganhoDeFocus.getSource() == textField2) {
				textField2.setText("");
                            //AQUI EU GOSTARIA QUE ASSIM QUE ESTE COMPONENTE RECEBESSE O FOCUS RECEBESSE O SET SETTEXT FICASSE COMO NULL , POREM DANDO O DEBUG ELE NEM ENTRA NO FOCUSGAINED
			}
		}

		public void focusLost(FocusEvent perdaDeFocus) {

		}

		// Este evento abaixo irá ocorrer quando o usuário apertar enter
		public void actionPerformed(ActionEvent evento) {
			String m = "";
			if (evento.getSource() == textField1) {
				m = String.format("Olá meu nome é : %s", evento
						.getActionCommand());
			} else if (evento.getSource() == textField2) {
				m = String.format("Seu nome é: %s", evento.getActionCommand());
			} else if (evento.getSource() == passwordField) {
				m = String.format("Sua senha é %s", evento.getActionCommand());
			}
			JOptionPane mensagem = new JOptionPane();
			mensagem.showMessageDialog(null, m);

		}
	}

}

Quero consertar esta parte do codigo!

private class TextFieldHandler implements ActionListener, FocusListener {

		// Este evento irá acontecer quando o componente tiver o focus
		public void focusGained(FocusEvent ganhoDeFocus) {
			if (ganhoDeFocus.getSource() == textField2) {
				textField2.setText("");
                            //AQUI EU GOSTARIA QUE ASSIM QUE ESTE COMPONENTE RECEBESSE O FOCUS RECEBESSE O SET SETTEXT FICASSE COMO NULL , POREM DANDO O DEBUG ELE NEM ENTRA NO FOCUSGAINED
			}
		}

		public void focusLost(FocusEvent perdaDeFocus) {

		}

Abraços!

2 Respostas

thiagolopes

Ja consegui resolver, o unico erro era que eu esqueci de colocar nos componentes o seguinte codigo:

componente.addFocusListener();

Abraços a todos e mais uma vez obrigado pela atençao!

RaulCrash

Thiago assim o seu evento não ficaria sempre sendo disparado ?? Pois tenho usado o FocusGained e tenho tido um grande problema com o mesmo, pois o evento é disparado enquanto o JtextField obtem o focu, e minha necessidade seria somente o uso do evento ao entrar no jtextfield uma unica vez, já tratei o evento com uma variavel só que fica estranho o codigo … não teria um evento nesse sentido de somente dispara uma unica vez quando o jtextfield recebe o focu ???

Criado 27 de junho de 2009
Ultima resposta 21 de jul. de 2010
Respostas 2
Participantes 2