2013-05-14 3 views

Antwort

57

Ich dachte, es könnte hilfreich sein, um ein Beispiel zu sehen, die die Change als anonyme innere Klasse wie scottb erwähnt angibt.

Ich hoffe, dass diese Antwort hilfreich ist!

+3

Führt dies vor oder nach dem eigentlichen Fokuswechsel aus? –

+0

Es ist erwähnenswert, dass 'changed' immer noch aufgerufen wird, auch wenn die Anwendung geschlossen ist, während 'yourTextField' den Fokus hat. Das war sehr unerwünscht für mich, und ich habe es geschafft, indem ich etwas in der Art von 'primaryStage.setOnCloseRequest (event -> { removeListeners(); });' – Jake

8

Sie wollen anhängen drucken drucken möchten ein ChangeListener in die FocusProperty des TextFields, das Sie überwachen möchten.

In JavaFX können Sie Benachrichtigungsereignisse (Change- oder Invalidation-Listener) an jede JavaFX-Eigenschaft anhängen, die ein Objekt besitzen kann, solange die Eigenschaft die Mindestdefinition für eine JavaFX-Bean erfüllt.

zu diesem Beitrag finden Sie, wenn Sie Ihre Event-Handler Abbrechen oder Schaltfläche Standard-Einstellungen zu tun andere Dinge werden wie ändern: JavaFX 2 -- Setting the defaultButton property: mutually exclusive?

Hier ist ein Code Änderungs Listener zu einem Textfeld zu befestigen:

txtDx.focusedProperty().addListener(m_txtDxListener); 

Das Listener-Objekt wurde in einem Instanzfeld gespeichert, sodass es sowohl mit addListener() als auch mit removeListener() verwendet werden kann. Für ein kurzlebiges TextField können Sie das Listener-Objekt mit einer anonymen inneren Klasse angeben.

Hier ist die private Klasse, die ich für meinen Fokus Zuhörer schrieb:

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); 
     } 
    } 
} 
+0

Scottb .... Ich bin nicht in der Lage zu verstehen. Können Sie bitte ein kleines Beispiel geben –

+2

Java Baba, fügen Sie einfach eine einfache Änderung Listener auf focusedProperty() der TextField, und prüfen, welche Art von fokussierten Zustand (true/false) ist es jetzt. –

4

Sie können die focusedProperty von Node verwenden, um eine ChangeListener anzuhängen.

Erweiterung die Antwort von Brendan: von JavaFX8 (wie es mit Java kommt 8), ein Ausdruck Lambda mit einem ternären Operator kombiniert kann es wirklich kompakt machen:

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