Como saber que focusLost foi acionado pela tecla TAB?

4 respostas
D

Olá turma, :smiley:

Como vou saber se o focusLost(FocusEvent e) de um componente foi acionado devido ao aperto da tecla TAB e não por outra tecla qualquer?
Assim: antes do foco mudar de componente, gostaria que o focusLost tivesse algum meio de saber que ele foi chamado porque a tecla TAB foi pressionada.

Olhei a classe FocusEvent mas lá nada tem a respeito…
Obrigada, aguardarei ajuda.

4 Respostas

ViniGodoy

Por que você quer saber se foi o especificamente o tab?

Geralmente, não se usa eventos do tipo focusLost em Swing, por eles não serem multiplataforma.

D

Porque quando a tecla tab é pressionada, o foco muda para o próximo componente. Para todos os componentes da tela, está correto, porém em determinado ponto quando o componente x ganha o foco, este só poderá sair depois que pressionado um dos componentes x ou y. Consegui fazer isso mas a tecla TAB estraga tudo pois ela não é detectada no keyListener(KeyEvent e) quando pressionada. Precisaria identificar que ela foi pressionada para evitar a troca de foco. :frowning:

Não usar focusLost por não ser multiplataforma… entendi moço mas, devo usar o que no lugar?

Obrigada.

ViniGodoy

Existem objetos específicos para fazer validações e coisas do tipo:
- O InputVerifier, que faz validação do campo de texto quando ele sai de foco;
- O Document, que permite mapear modificações no texto;

Existe também formas de controlar o mecanismo de foco.
http://docs.oracle.com/javase/tutorial/uiswing/misc/focus.html

Esse componente que não pode perder foco é uma caixa de textos? Se for, você poderá impedir que ela perca o foco com um InputVerifier:

public class FocusController extends InputVerifier {
    private boolean canLeave = false;

    public boolean verify(JComponent input) {
        return canLeave;
    }

    public void setCanLeave(boolean can) {
        canLeave = can;
    }
}

Aí é só associar ele ao seu JTextField:

focusController = new FocusController();
seuTextField.setInputVerifier(focusController);
E para habilitar a saída do foco:
controller.setCanLeave(true);
D

Humm… interessante Vinicius, são dois botões. Mas dessa idéia, fazendo algumas modificações, seja possível achar a solução. Vou tentar…
Obrigada. :smiley:

Criado 17 de janeiro de 2012
Ultima resposta 17 de jan. de 2012
Respostas 4
Participantes 2