2013-06-28 34 views
8

Tôi đang trong quá trình chuyển đổi một ứng dụng JavaFX từ việc khai báo/cấu hình các điều khiển của nó trong mã Java để tách bố cục thành cấu hình FXML. Vấn đề tôi gặp phải là tôi không thể định vị thuộc tính tương đương (?) Với ChangeListener của mã.Thuộc tính FXML tương đương với ChangeListener?

Trong đoạn mã Java ban đầu, tôi có

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

Về gần nhất tôi có thể sử dụng FXML là:

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

Vấn đề với việc sử dụng onKeyPressed là nó không đón dán vào các giá trị như ChangeListener. Làm thế nào để thêm một người nghe thay đổi trong FXML?

Trả lời

3

Bạn không thể làm điều đó vì thuộc tính giá trị là một phần con của TextField. Vì vậy, bạn phải viết nó trong mã của bạn. FXML chỉ xuất hiện cho các khía cạnh đồ họa. Để biết thêm thông tin về FXML:

+6

Tôi đoán Tôi chỉ bối rối là tại sao tôi có thể thêm một sự kiện onKeyPressed, nhưng không phải là một sự kiện onChange trong FXML. Có vẻ như tôi phải có khả năng làm cả hai, hoặc không làm. – Todd

+2

Chỉ vì một người nghe thay đổi không chỉ là một hàm mà là một người nghe trên một thuộc tính. Đó là cách nghĩ về Java FX. – PhilippeGeek

+2

@PhilippeGeek Vấn đề với JavaFX là sự đa dạng của nó. Bạn có thể nghe thay đổi các sự kiện của CheckBox bằng cách sử dụng onAction trong FXML (mặc dù onAction cũng là một thuộc tính). Tuy nhiên, bạn không thể làm tương tự với Spinners, TextAreas và nhiều thứ khác. Tôi ước rằng sẽ có một loại siêu phổ biến "Field" cho tất cả những thành phần mang giá trị. Và loại siêu này phải có phương thức setOnValueChange và thuộc tính giá trị. –

Các vấn đề liên quan