Trabalhando com Swing, tenho 5 JtextField´s em um panel, e preciso fazer um teste específico cada vez que sair de um destes Jtextfields, porem nao estou conseguindo, tentei utilizar o evento FocusLost, porem foi uma decepcao.
Mas porque? O evento focusLost() não foi disparado? Ou não funcionou? Qual o problema (mais detalhadamente)?
sidnei…estranho nao funcionar o focuslost…ele deveria disparar…
vc ja tentou usar o ActionListener??
ate mais…
Toda vez que teclo alguma coisa o evento focuslost é disparado, ou, parece que este é o sintoma, preciso de algo que seja executado somente quando realmente sair do jtexfield.
- Outro detalhe, tenho o java 1.2 e 1.4, em ambos o comportamento
do focuslost é o mesmo, porém no 1.4 se houver mais de um
jtextfield com o evento focuslost ligado, o programa tranca.
[quote=“richardpeder”]sidnei…estranho nao funcionar o focuslost…ele deveria disparar…
vc ja tentou usar o ActionListener??
ate mais…[/quote]
Quanto ao ActionListener, só consegui fazer o programa disparar este
evento quando pressiono a tecla entra, porém preciso de algo que
seja executado toda vez que sair do campo.
Quanto a sua citacao “Estrano nao funcionar”, o que parece acontecer
é que a cada tecla pressionada o procedimento focuslost é executado,
e isto é um incomodo sem par, alem do mais no java 1.4 nao consegui
que mais de um jtextfield tivesse o evento focuslost acionado pois o programa trava. (no java 1.2 o fato de ter mais de um jtextfield com o
evento focuslost acionado nao causava este travamento, apesar de apresentar o sintoma acima descrito.)
Sidney, eu estou longe da minha maquina de desenvolvimento…
Tente comparar o seu código com o seguinte:
class MeuFrame extends JFrame implements FocusListener {
private JTextField txtA;
private JTextField txtB;
public MeuFrame() {
txtA = new JTextField();
txtB = new JTextField();
setSize(300, 200);
txtA.addFocusListener(this);
txtB.addFocusListener(this);
JPanel p = new JPanel();
p.setLayout(new FlowLayout(FlowLayout.CENTER));
p.add(txtA);
p.add(txtB);
getContentPane().add(p, BorderLayout.SOUTH);
}
public void focusGained(FocusEvent e) { // não faz nada aqui }
public void focusLost(FocusEvent e) {
Object o = e.getSource();
if (o == txtA) JOptionPane.showMessageDialog(this, "Deixou A");
else if (o == txtB) JOptionPane.showMessageDialog(this, "Deixou B");
}
}
public class Teste {
public static void main(String[] args) {
JFrame f = new MeuFrame();
f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
f.setVisible(true);
}
}
Não esqueça dos imports.
(*** talvez tenha que dar uma adaptada, como disse não tenho referência aqui, pode dar um errinho ou outro, mas o esqueleto é esse ai ***)
Espero ter ajudado.
Sidnei…
pensei em um keyListener() onde vc poderia coloca-lo no JTextField e cada vez que o usuario pressionasse uma determinada tecla (vc deve comparar essa tecla com o evento de pressionamento(KeyEvent) aconteceria alguma coisa no textfield…
eh mais uma ideia!!! :lol:
ate mais…
Abaixo segue exemplo do programa, nao sei porque mas em java 1.2
quando pressiono TAB passa MUITAS vezes pela rotina definida no
focuslost, e em java 1.4 é mostrada uma janela de mensagem
vazia e nao sai mais.
import java.awt.;
import java.awt.event.;
import javax.swing.;
import javax.swing.border.;
public class Teste extends JFrame implements FocusListener {
private JTextField txtA;
private JTextField txtB;
public Teste() {
txtA = new JTextField();
txtB = new JTextField();
setSize(300, 200);
txtA.addFocusListener(this);
txtB.addFocusListener(this);
JPanel p = new JPanel();
p.setLayout(new FlowLayout(FlowLayout.CENTER));
p.add(txtA);
p.add(txtB);
txtA.setText (" ");
txtB.setText (" ");
getContentPane().add(p, BorderLayout.SOUTH);
}
public void focusGained(FocusEvent e) {
// Nao faz nada aqui
}
public void focusLost(FocusEvent e) {
Object o = e.getSource();
if (o == txtA) JOptionPane.showMessageDialog(this, “Deixou A”);
else if (o == txtB) JOptionPane.showMessageDialog(this, “Deixou B”);
}
public static void main(String[] args) {
JFrame f = new Teste();
f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
f.setVisible(true);
}
}
Olha… pelo que parece, o que esta causando esse problema da janela que se abre a nao fecha mais é por causa do JOptionPane… Fiz um teste usando um System.out.println() mesmo, e funcionou direitinho…
[]´s