Como executar tarefas no javaFX TextField em onfocus e outfocus?

Eu estou trabalhando no projeto JavaFX. Eu preciso executar alguma tarefa em um TextField JavaFX.

Por exemplo, no evento “on focus” para o TextField eu quero imprimir

 System.out.println("Textfield on focus"); 

e no evento “fora de foco” ele deve imprimir

 System.out.println("Textfield out focus"); 

Eu pensei que poderia ser útil ver um exemplo que especifica o ChangeListener como uma class interna anônima como o scottb mencionado.

 TextField yourTextField = new TextField(); yourTextField.focusedProperty().addListener(new ChangeListener() { @Override public void changed(ObservableValue arg0, Boolean oldPropertyValue, Boolean newPropertyValue) { if (newPropertyValue) { System.out.println("Textfield on focus"); } else { System.out.println("Textfield out focus"); } } }); 

Espero que esta resposta seja útil!

Você desejará append um ChangeListener ao FocusProperty do TextField que você deseja monitorar.

No JavaFX, você pode append events de notificação (Listeners de Alteração ou Invalidação) a qualquer propriedade JavaFX que um object possa possuir, desde que a propriedade atenda à definição mínima para um bean JavaFX.

Consulte este post se os manipuladores de events fizerem outras coisas, como modificar as configurações dos botões Cancelar ou Padrão: JavaFX 2 – Configurando a propriedade defaultButton: mutuamente exclusivo?

Aqui está algum código para append um Ouvinte de Alteração a uma checkbox de texto:

 txtDx.focusedProperty().addListener(m_txtDxListener); 

O object Listener foi armazenado em um campo de instância para que possa ser usado com addListener () e removeListener (). Para um TextField de curta duração, você pode especificar o object ouvinte com uma class interna anônima.

Aqui está a class privada que escrevi para meu ouvinte de foco:

 private class FocusPropertyChangeListener implements ChangeListener { FocusPropertyChangeListener() { System.out.println("New FPCL instance"); } @Override public void changed(ObservableValue ov, Boolean oldb, Boolean newb) { System.out.println("Focus change triggered"); if (ancEncEditor.isVisible() && !ancEncEditor.isDisabled()) { boolean b = (newb != null && newb.booleanValue() == true); System.out.println("txtDx focus change event triggered: DxAdd = " + b); if (b) { btnDxAdd.setDefaultButton(true); } else { btnWindowCommit.setDefaultButton(true); } btnWindowCommit.setCancelButton(true); btnDxAdd.setDefaultButton(b); } } } 

Você pode usar o focusedProperty of Node para append um ChangeListener .

Estendendo a resposta do Brendan: do JavaFX8 (como vem com o Java 8), uma expressão lambda combinada com um operador ternário pode torná-lo realmente compacto:

 textField.focusedProperty().addListener((obs, oldVal, newVal) -> System.out.println(newVal ? "Focused" : "Unfocused"));