2013-06-28 8 views
8

Je suis en train de convertir une application JavaFX de la déclaration/configuration de ses contrôles en code Java à la division de la mise en page en une configuration FXML. Le problème que j'ai est que je ne peux pas localiser l'attribut équivalent (?) Au ChangeListener du code.Attribut FXML équivalent à ChangeListener?

Dans le code Java d'origine, je

class TextFieldChangeListener implements ChangeListener<String> { 
     private boolean isRequiredDataPresent() { 
      return outputNameTextField.getText().length() > 0 && numOfOutputFilesTextField.getText().length() > 0; 
     } 

     @Override 
     public void changed(ObservableValue<? extends String> observableValue, String s, String s2) { 
      mergeButton.setDisable(! isRequiredDataPresent()); 
     } 
    } 

A propos de la plus proche que je peux obtenir l'aide FXML est:

<TextField id="outputNameTextField" onKeyPressed="#textBoxOnChange" promptText="Path of merge file" GridPane.columnIndex="1" GridPane.rowIndex="3" GridPane.columnSpan="2" GridPane.rowSpan="1" /> 

Le problème avec l'utilisation onKeyPressed est qu'il n'a pas pick-up collé dans des valeurs comme ChangeListener. Comment ajouter un écouteur de changement dans FXML?

Répondre

3

Vous ne pouvez pas faire cela parce que la propriété value est une sous-partie de TextField. Donc vous devez l'écrire dans votre code. FXML vient seulement pour les aspects graphiques. Pour plus d'informations sur FXML:

+6

Je suppose que je suis confus quant à la raison pour laquelle je peux ajouter un événement onKeyPressed, mais pas un événement onChange dans le FXML. Il semble que je devrais pouvoir faire les deux, ou ne faire ni l'un ni l'autre. – Todd

+2

C'est seulement parce qu'un écouteur de changement n'est pas seulement une fonction mais un écouteur sur une propriété. C'est la façon de penser à Java FX. – PhilippeGeek

+2

@PhilippeGeek Le problème avec JavaFX est sa diversité. Vous pouvez écouter pour modifier les événements de CheckBox en utilisant onAction dans FXML (bien que onAction soit également une propriété). Cependant, vous ne pouvez pas faire la même chose avec Spinners, TextAreas et beaucoup d'autres. Je souhaite qu'il y ait un super type commun "Field" pour tous les composants qui portent une valeur. Et ce super type devrait avoir une méthode setOnValueChange et une propriété value. –

Questions connexes