Estou desenvolvendo uma aplicação que faz o uso de teclas de atalho para disparar métodos comuns aos JButtons que são exibidos na tela.
segue um breve esquema:
Aqui inicio minha action (o atributo acaoCancelar é visivel por todo o JFrame)
Action acaoCancelar = new AbstractAction() {
private static final long serialVersionUID = 4026410755881130618L;
@Override
public void actionPerformed(ActionEvent arg0) {
cancelar();
}
};
Em um outro momento defino a acão a uma tecla do teclado:
getActionMap().put("acaoCancelar", acaoCancelar);
getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(KeyStroke.getKeyStroke("ESCAPE"), "acaoCancelar");
e tudo vinha funcionando muito bem. Para todos os botões.
entretanto, quando vou iniciar um cadastro nesta tela eu limpo os componentes da tela, redefino tabelas, botões de escolhas, e seto o foco (que estava em uma aba JPanel que continha isso tudo) no primeiro componente um JFormattedTextField com essas propriedades:
private JFormattedTextField getTxtCnpj() {
if (txtCnpj == null) {
try {
txtCnpj = new JFormattedTextField(new MaskFormatter("##############"));
txtCnpj.setText("");
txtCnpj.addFocusListener(new FocusAdapter() {
@Override
public void focusLost(FocusEvent fe) {
vefiricaCPF_CNPJ();
}
});
txtCnpj.setFocusLostBehavior(JFormattedTextField.COMMIT);
txtCnpj.setBounds(100, 19, 97, 20);
txtCnpj.setColumns(10);
} catch (ParseException e) {
e.printStackTrace();
}
}
return txtCnpj;
}
Então quando estava testando o comportamento dos botões - que entram em Enabled true ou false dependendo do estado da tela - o botão relacionado ao Escape da Action definida necessita que seja pressionado Duas vezes para ser registrado (diferente do comportamento inicial dele) e ao contrario de quando eu defino um mnemônico para ele (alt+c) que também dispara imediatamente.
Achei que fosse um problema com o ouvinte de (lostFocus) que uso nele, mas testei o foco inicial em um JTextField que também tem um lostFocus e não obtive o problema.
Posso estar enganado mas creio que o problema seja isso aqui:
txtCnpj.setFocusLostBehavior(JFormattedTextField.COMMIT);
entretanto necessito deste camarada e não posso descarta-lo.
Alguém já passou por este problema? ou me sugere uma alternativa para isso?