2013-06-28 7 views
8

Sono nel processo di conversione di un'applicazione JavaFX di dichiarare/configurare i propri controlli nel codice Java per dividere il layout per una configurazione FXML. Il problema che sto avendo è che non riesco a trovare l'attributo equivalente (?) Al ChangeListener del codice.Attributo FXML equivalente a ChangeListener?

Nel codice Java originale, ho

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

Circa il più vicino posso ottenere utilizzando FXML è:

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

Il problema con l'utilizzo onKeyPressed è che non pick-up incollato valori come ChangeListener. Come aggiungo un listener di modifiche in FXML?

risposta

3

Non è possibile farlo perché la proprietà value è una sottocategoria di TextField. Quindi devi scriverlo nel tuo codice. FXML viene solo per gli aspetti grafici. Per ulteriori informazioni su FXML:

+6

Credo di essere solo confuso sul motivo per cui posso aggiungere un evento onKeyPressed, ma non un evento onChange nel FXML. Sembra che dovrei essere in grado di fare entrambi, o non fare né l'uno né l'altro. – Todd

+2

È solo perché un listener di modifiche non è solo una funzione ma un listener su una proprietà. È il modo di pensare di Java FX. – PhilippeGeek

+2

@PhilippeGeek Il problema con JavaFX è la sua diversità. Puoi ascoltare cambiare gli eventi di CheckBox usando onAction in FXML (sebbene onAction sia anche una proprietà). Tuttavia, non puoi fare lo stesso con Spinners, TextAreas e molti altri. Vorrei che ci fosse un comune tipo "campo" per tutti quei componenti che hanno un valore. E questo super tipo dovrebbe avere un metodo setOnValueChange e una proprietà value. –