繁体   English   中英

如何绑定ObjectProperty <LocalDate> JavaFX中的StringProperty?

[英]How to bind ObjectProperty<LocalDate> to StringProperty in JavaFX?

我正在尝试在两个不同的属性之间进行绑定。 如何将ObjectProperty<LocalDate>绑定到StringProperty

任务类别

 public class Task {

    StringProperty time = new SimpleStringProperty();
    ObjectProperty<String> testCase = new SimpleObjectProperty<>();
    StringProperty date = new SimpleStringProperty();

    public Task(String date, String time, String testCase) {
        this.date.set(date);
        this.time.set(time);
        this.testCase.set(testCase);
    }

    public String getdate() {
        return date.get();
    }

    public void setDate(String date) {
        this.date.set(date);
    }

    public StringProperty dateProperty() {
        return date;
    }
    }

控制器类

public class Controller implements Initializable {

@FXML
private DatePicker datePicker;

private Task currentTask = new Task();

@Override
public void initialize(URL location, ResourceBundle resources) {
   datePicker.valueProperty().bindBidirectional(currentTask.dateProperty());
      }
}

如果Task.date应该表示一个日期,则使Task.date成为ObjectProperty<LocalDate>似乎更有意义。 然后,您可以按照通常的方式双向绑定它们:

public class Task {

    private ObjectProperty<LocalDate> date = new SimpleObjectProperty<>();

    // ...

    public ObjectProperty<LocalDate> dateProperty() {
        return date ;
    }

    public final LocalDate getDate() {
        return dateProperty().get();
    }

    public final void setDate(LocalDate date) {
        dateProperty().set(date);
    }
}

然后当然

datePicker.valueProperty().bindBidirectional(currentTask.dateProperty());

完全根据需要工作。

请注意,由于在注释中您说的是在使用XMLEncoder数据时正在使用StringProperty ,因此在这种情况下使用此方法是完全可能的。 请参阅LocalDate序列化错误


如果您确实希望这是一个StringProperty (并且我应该强调,以这种方式这样做确实没有任何意义),则可以使用StringConverter

DateTimeFormatter formatter = DateTimeFormatter.ISO_LOCAL_DATE ;

StringConverter<LocalDate> converter = new StringConverter<LocalDate>() {
    @Override
    public LocalDate fromString(String string) {
        return string == null || string.isEmpty() ? null : LocalDate.parse(string, formattter);
    }
    @Override
    public String toString(LocalDate date) {
        return date == null ? null : formatter.format(date);
    }
};

最后:

currentTask.dateProperty().bindBidirectional(datePicker.valueProperty(), converter);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM