Setar foco em botão quando um jPasswordField chegar a um certo número de caracteres

Boa noite a todos.
Sou iniciante em programação JAVA e tive pesquisando a internet a fora e não encontrei uma solução para a seguinte situação:
tenho uma tela de login do tipo JFrame que possui 1 campo de texto(jtextfield) e 1 campo de senha(jpasswordfield) e dois botões (confirmar e cancelar).
gostaria de saber se teria como ao digitar um certo número de caracteres no campo de senha, o foco fosse automaticamente para o botão confirmar?
Agradeço a atenção dos companheiros do fórum.

Tem sim, mas isso denuncia o número de caracteres máximo que a senha tem.

Melhor que isso, transforme o seu botão confirmar no botão padrão:

getRootPane().setDefaultButton(btnConfirmar);

Isso fará com que ele seja ativado quando seu usuário pressionar enter.

Então, acho que me expressei errado.
Eu gostaria de setar o foco quando o jpasswordField chegasse a um certo numero de caracteres, tipo a minha senha tem 6 digitos mas o foco apareceria quando chegasse no 4 digito por exemplo.
Obrigado a todos

é isso que você quer?

[code]import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextField;

@SuppressWarnings(“serial”)
public class TrocarFocoPeloTamanho extends JFrame {
public TrocarFocoPeloTamanho(){
this.setSize(400,400);
this.setLayout(null);
final JButton botao = new JButton(“Botão”);
botao.setBounds(10, 40, 60, 40);
final JTextField campo = new JTextField();
campo.setBounds(10, 10, 100, 20);
campo.addKeyListener(new KeyListener() {
@Override
public void keyTyped(KeyEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void keyReleased(KeyEvent arg0) {
// TODO Auto-generated method stub
}
@Override
public void keyPressed(KeyEvent arg0) {
if(campo.getText().length()>=5){
botao.grabFocus();
}
}
});
this.add(campo);
this.add(botao);
this.setVisible(true);
}

public static void main(String[] args) {
	new TrocarFocoPeloTamanho();

}

}[/code]

só troca o JTextField por um JPasswordField

Apenas uma dica: neste caso acho que seria melhor usar um DocumentListener, pois se o usuário colar o texto com o mouse, keyPressed não será executado.

E se a senha tem 6 dígitos e o foco for para o botão quando for inserido o quarto dígito, será chato para digitar a senha toda. Acho que a intenção é habilitar o botão, não é isso? Se for deve usar setEnabled.

boa! valeu Eric Yuzo nem sabia que essa interfase existia! (nesses casos sempre resolvia com keyPressed e sempre tinha esse problema :smiley: )
valeu mesmo!

[quote=InSeOfKn]boa! valeu Eric Yuzo nem sabia que essa interfase existia! (nesses casos sempre resolvia com keyPressed e sempre tinha esse problema :smiley: )
valeu mesmo! [/quote]
É normal. Eu também resolvia isso com keyPressed. Acho que a grande maioria das pessoas fazem isso no começo.

Além disso, você deveria ler o javadoc do método grabFocus():

[quote]public void grabFocus()

Requests that this Component get the input focus, and that this Component's top-level ancestor become the focused Window. This component must be displayable, visible, and focusable for the request to be granted.

This method is intended for use by focus implementations.[b] Client code should not use this method; instead, it should use requestFocus()[/b]. [/quote]

Mas calma, antes de usar o request focus, é bom ler o javadoc dele também:

[quote]public void requestFocus()

Description copied from class: Component
Requests that this Component get the input focus, and that this Component's top-level ancestor become the focused Window. This component must be displayable, visible, and focusable for the request to be granted. Every effort will be made to honor the request; however, in some cases it may be impossible to do so. Developers must never assume that this Component is the focus owner until this Component receives a FOCUS_GAINED event. If this request is denied because this Component's top-level Window cannot become the focused Window, the request will be remembered and will be granted when the Window is later focused by the user.

This method cannot be used to set the focus owner to no Component at all. Use KeyboardFocusManager.clearGlobalFocusOwner() instead.

Because the focus behavior of this method is platform-dependent, developers are strongly encouraged to use requestFocusInWindow when possible. [/quote]

Ou seja, no lugar de grabFocus(), que não deve ser usado sob hipótese nenhuma, use o requestFocusInWindow().

[quote=Eric Yuzo]Apenas uma dica: neste caso acho que seria melhor usar um DocumentListener, pois se o usuário colar o texto com o mouse, keyPressed não será executado.

E se a senha tem 6 dígitos e o foco for para o botão quando for inserido o quarto dígito, será chato para digitar a senha toda. Acho que a intenção é habilitar o botão, não é isso? Se for deve usar setEnabled.[/quote]

Certo, minha intenção era o foco mas como o colega disse ficaria chato colocar a senha
Agora o botão habilitado acho que ficaria melhor, mas como faria isso? alguém poderia me ajudar? pois ja tentei iniciar com o botão apagado e pegar o tamanho com length mas não funcionou
Obrigado a todos.

Com DocumentListener e setEnabled ficaria assim:

passwordField.getDocument().addDocumentListener(new DocumentListener() { @Override public void insertUpdate(DocumentEvent e) { if (passowrdField.getPassword().length >= 4) { button.setEnabled(true); } } @Override public void removeUpdate(DocumentEvent e) { if (passowrdField.getPassword().length < 4) { button.setEnabled(false); } } @Override public void changedUpdate(DocumentEvent e) {} });
Mas deixa eu te perguntar, isso não é para se logar não né? Se for, é melhor deixar sem limite mesmo, se o usuário digitar a senha errada, ele não vai ter acesso e pronto, assim como acontece em qualquer sistema de login. E mesmo que seja para cadastrar o login, pode fazer esta validação no botão, assim você pode exibir uma mensagem explicando o problema. Pode ser que o usuário coloque 3 dígitos na senha e não entenda porque não consegue clicar no botão.

Sem falar que isso dá uma senhora dica para quem quiser quebrar a senha. A pessoa sabe que tem exatamente 4 dígitos, o que restringe as tentativas por força bruta a apenas 10000.

A solução do Eric deixa melhor pq dá a entender que a senha tem “pelo menos” 4 dígitos.