web-dev-qa-db-ja.com

onfocusおよびoutfocusでJavaFX TextFieldのタスクを実行する方法

私はJavaFXプロジェクトに取り組んでいます。 JavaFX TextFieldでいくつかのタスクを実行する必要があります。

たとえば、印刷したいTextFieldの「フォーカス中」イベント

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

「out focus」イベントでは、印刷する必要があります

System.out.println("Textfield out focus");
44
java baba

前述のscottbのような匿名の内部クラスとしてChangeListenerを指定する例を見ると役立つと思いました。

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

この回答がお役に立てば幸いです!

79
Brendan

focusedPropertyNode を使用して、ChangeListenerをアタッチできます。

Brendanからの答えを拡張します:JavaFX8から(Java 8に付属)、ラムダ式と三項演算子を組み合わせると、本当にコンパクトになります:

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

監視するTextFieldのFocusPropertyにChangeListenerを添付します。

JavaFXでは、プロパティがJavaFX Beanの最小定義を満たす限り、オブジェクトが所有するJavaFXプロパティに通知イベント(変更リスナーまたは無効化リスナー)を添付できます。

イベントハンドラーが[キャンセル]または[デフォルト]ボタン設定の変更など、他のことを行う場合は、この投稿を参照してください。 JavaFX 2-defaultButtonプロパティの設定:相互に排他的?

変更リスナーをテキストボックスに添付するコードを次に示します。

txtDx.focusedProperty().addListener(m_txtDxListener);

Listenerオブジェクトは、addListener()とremoveListener()の両方で使用できるように、インスタンスフィールドに格納されています。短命のTextFieldの場合、リスナーオブジェクトを匿名内部クラスで指定できます。

これが、フォーカスリスナー用に作成したプライベートクラスです。

private class FocusPropertyChangeListener implements ChangeListener<Boolean> {

    FocusPropertyChangeListener() { System.out.println("New FPCL instance"); }

    @Override
    public void changed(ObservableValue<? extends Boolean> 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);
        }
    }
}
8
scottb