JavaFX:适配器,ObjectProperty和双向绑定

时间:2017-01-04 17:26:37

标签: java javafx

我想了解ObjectProperty如何工作,但仍然没有运气。 我有以下POJO:

public class Article{

    private LocalDateTime dateTime;

    private final PropertyChangeSupport propertyChangeSupport;

    public Article(String title) {
        this.propertyChangeSupport = new PropertyChangeSupport(this);
    }

    public LocalDateTime getDateTime() {
        return dateTime;
    }

    public void setDateTime(LocalDateTime dateTime) {
        LocalDateTime pv = this.dateTime;
        this.dateTime = dateTime;
        propertyChangeSupport.firePropertyChange("dateTime", pv, this.dateTime);
    }

    public void addPropertyChangeListener(PropertyChangeListener listener) {
        propertyChangeSupport.addPropertyChangeListener(listener);
    }

    public void removePropertyChangeListener(PropertyChangeListener listener) {
        propertyChangeSupport.removePropertyChangeListener(listener);
    }
} 

现在,我为dateTime字段创建了objectProperty:

ObjectProperty<LocalDateTime> dateTimeProperty=new JavaBeanObjectPropertyBuilder().bean(article).name("dateTime").build();

现在我想将这个dateTimeProperty绑定到textField.textProperty()。我不知道如何做到这一点:如何格式化数据以在textField中显示dateTime?在textField中输入新的日期时间时,如何创建LocalDateTime实例?我们确实有双向绑定。请解释一下。

2 个答案:

答案 0 :(得分:1)

为什么不将bean创建为JavaFX Bean

public class Article {
    private ObjectProperty<LocalDateTime> dateTime = new SimpleObjectProperty<>();
    public final ObjectProperty<LocalDateTime> dateTimeProperty() {
         return dateTime;
    }
    public void setDateTime(LocalDateTime ldt) {
         dateTime.set(ldt);
    }
    public LocalDateTime getDateTime() {
         return dateTime.get();
    }
}

然后在您的控件中使用格式化程序

绑定到文本控件
myTextField.textProperty().bindBidirectional(article.dateTimeProperty(), new LocalDateTimeStringConverter());

答案 1 :(得分:1)

最佳选择是在文本字段中使用TextFormatter

// choose whatever formats you need here...
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy HH:mm:ss");
DateTimeFormatter parser = DateTimeFormatter.ofPattern("d/M/y H:m:s");

TextFormatter<LocalDateTime> textFormatter = new TextFormatter(new LocalDateTimeStringConverter(formatter, parser));
myTextField.setTextFormatter(textFormatter);

然后

textFormatter.valueProperty().bindBidirectional(dateTimeProperty);

如果需要,您还可以在TextFormatter上指定一个过滤器,将编辑限制为仅在此上下文中有意义的字符(尽管其详细信息可能会有点棘手)。有关详细信息,请参阅TextFormatter.Change的文档。