2013-06-28 2 views
8

Ich bin dabei, eine JavaFX-Anwendung von der Deklaration/Konfiguration ihrer Steuerelemente in Java-Code zum Aufteilen des Layouts in eine FXML-Konfiguration zu konvertieren. Das Problem, das ich habe, ist, dass ich das äquivalente Attribut (?) Zu dem ChangeListener des Codes nicht finden kann.Äquivalentes FXML-Attribut zu ChangeListener?

In dem ursprünglichen Java-Code, ich habe

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

über den nächstgelegene ich FXML verwendet bekommen kann:

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

Das Problem mit onKeyPressed ist, dass es Pickup klebt nicht in Werte wie ChangeListener tut. Wie füge ich einen Änderungslistener in FXML hinzu?

Antwort

3

Sie können das nicht tun, weil die Eigenschaft value ein Unterteil von TextField ist. Also musst du es in deinen Code schreiben. FXML kommt nur für die grafischen Aspekte. Weitere Informationen über FXML:

+6

Ich glaube, ich bin nur verwirrt, warum ich ein onKeyPressed Ereignis hinzufügen kann, aber nicht ein OnChange-Ereignis in der FXML. Es scheint, als müsste ich beides tun können oder auch nicht. – Todd

+2

Dies liegt nur daran, dass ein Änderungslistener nicht nur eine Funktion, sondern auch ein Listener für eine Eigenschaft ist. Es ist die Art, an Java FX zu denken. – PhilippeGeek

+2

@PhilippeGeek Das Problem mit JavaFX ist seine Vielfalt. Sie können die Ereignisse von CheckBoxes mit onAction in FXML ändern (obwohl onAction auch eine Eigenschaft ist). Mit Spinner, TextAreas und vielen anderen können Sie jedoch nicht dasselbe tun. Ich wünschte, es gäbe einen gemeinsamen Supertyp "Feld" für all jene Komponenten, die einen Wert tragen. Und dieser Super-Typ sollte eine setOnValueChange-Methode und eine value-Eigenschaft haben. –