2015-04-28 15 views
6

Zderzyłem się z czymś, co wydaje się (dla mnie tak czy inaczej) dziwnym problemem z wirującymi JavaFX i niemożnością dołączania do niego jakiegokolwiek słuchacza.Jak dołączyć słuchacza do pokrętła JavaFX?

Jestem przyzwyczajony do programowania Swing, gdzie mogę dołączyć ChangeListener do JSpinnera i odbierać zdarzenia w ten sposób, ale JavaFX nie ma czegoś podobnego.

Kod w pytaniu ...

IntegerSpinnerValueFactory spinnerValueFactory = new SpinnerValueFactory.IntegerSpinnerValueFactory(0, Integer.MAX_VALUE); 

    hullPointsSpinner = new Spinner<Integer>(spinnerValueFactory); 
    hullPointsSpinner.setEditable(true); 

    ((TextField)hullPointsSpinner.getEditor()).setOnAction(new EventHandler<ActionEvent>() { 

     public void handle(ActionEvent event) 
     { 
     System.out.println("Howdy, folks! Value is " + hullPointsSpinner.getValue() + "!!"); 
     } 
    }); 

Przyciski strzałek będzie zwiększać i zmniejszać wartość w polu, ale nie mają wpływu na wartości w modelu. Tylko wybranie zawartości pola i naciśnięcie klawisza enter spowoduje aktualizację danych w modelu i wydrukowanie wartości. (Wciśnięcie klawisza enter jest w dokumentacji, wiem.)

Mam również świadomość, że umieszczam ten EventHandler na TextField Spinner z getEditor, ale jeszcze nie widzę innego sposobu, aby to zrobić.

Czy istnieje sposób podpięcia słuchacza do przycisków pokrętła?
(Heck, czy istnieje sposób, aby uzyskać dostęp do tych przycisków, aby dołączyć słuchacza?)

Czy otrzymuję nieprawidłowe wydarzenie od spinner/editor? Czy mogę umieścić słuchacza na spinnerValueFactory?
Czy istnieje jakieś oczywiste rozwiązanie, którego tu nie ma?

Zamienię to na JSpinnera, jeśli to konieczne, ale wydaje mi się to szalone, że ten interfejs API będzie miał komponent typu spinner i taki niewygodny sposób na jego użycie.

Z góry dziękuję.

Odpowiedz

11

Poniższa wydaje się działać dobrze dla mnie:

hullPointsSpinner.valueProperty().addListener((obs, oldValue, newValue) -> 
    System.out.println("New value: "+newValue)); 

Alternatywnie można zrobić

spinnerValueFactory.valueProperty().addListener(...); 

z tego samego słuchacza jak wyżej.

Powinieneś zauważyć this bug, który jest ustalony w 1.8.0u60.

+0

Dziękuję !!!!!! Walczę z tym przez dwa dni! Wciąż nie całkiem na JavaFX, ale dostaję się tam. – BozemanPhil

+0

YW. Tylko dla FYI, jest to zasadniczo sposób działania wszystkich kontrolek JavaFX przechowujących wartość (prawdopodobnie wszystko oprócz 'Button'). 'checkBox.selectedProperty(). addListener (...)', 'textField.textProperty(). addListener (...)', 'comboBox.valueProperty(). addListener (...)', itp. –

+0

Dziękuję bardzo za odpowiedź. – 7twenty7