2013-05-14 10 views

Odpowiedz

57

Pomyślałem, że może to być pomocne, aby zobaczyć przykład, który określa ChangeListener jako anonimowej klasy wewnętrznej jak scottb wymienione.

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"); 
     } 
    } 
}); 

Mam nadzieję, że ta odpowiedź jest pomocna!

+3

Czy to działanie przed lub po fokusowaniu faktycznie się zmienia? –

+0

Warto zauważyć, że 'zmieniony' nadal będzie wywoływany, nawet jeśli aplikacja zostanie zamknięta, podczas gdy' yourTextField' ma fokus. Było to bardzo niepożądane dla mnie i obejść go, robiąc coś na wzór 'primaryStage.setOnCloseRequest (event -> { removeListeners(); });'; – Jake

8

Będziemy chcieli, aby dołączyć a ChangeListener do FocusProperty z TextField, które chcesz monitorować.

W języku JavaFX można dołączać zdarzenia powiadomień (Odsyłacze zmian lub identyfikatorów) do dowolnej właściwości JavaFX, którą obiekt może posiadać, o ile właściwość spełnia minimalną definicję komponentu JavaFX.

Patrz na to stanowisko, jeśli obsługi zdarzeń będzie robić inne rzeczy, takie jak modyfikowanie anulować lub przycisk Domyślne ustawienia: JavaFX 2 -- Setting the defaultButton property: mutually exclusive?

Oto kod, aby dołączyć Zmień Listener do pola tekstowego:

txtDx.focusedProperty().addListener(m_txtDxListener); 

Obiekt Listener został zapisany w polu instancji, dzięki czemu może być używany zarówno z addListener(), jak i removeListener(). W przypadku krótkiego obiektu TextField można określić obiekt detektora za pomocą anonimowej klasy wewnętrznej.

Oto klasa prywatny, który napisałem dla mojego ostrości słuchacza:

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 .... nie jestem w stanie Rozumiesz. Czy możesz podać mały przykład –

+2

java baba, wystarczy dodać prosty detektor zmian w focusedProperty() z TextField i sprawdzić, jaki rodzaj stanu skupienia (true/false) jest teraz. –

4

Możesz użyć focusedProperty z Node, aby dołączyć ChangeListener.

Rozszerzanie odpowiedź od Brendan: od JavaFX8 (jak to jest z Java 8) wyrażenia lambda w połączeniu z operatorem potrójnego może uczynić go naprawdę kompaktowy:

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