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

JavaFX:适配器、ObjectProperty和双向绑定,java,javafx,Java,Javafx,我想了解ObjectProperty是如何工作的,但仍然不走运。 我有以下几点建议: public class Article{ private LocalDateTime dateTime; private final PropertyChangeSupport propertyChangeSupport; public Article(String title) { this.propertyChangeSupport = new Propert

我想了解ObjectProperty是如何工作的,但仍然不走运。 我有以下几点建议:

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();
ObjectProperty dateTimeProperty=new JavaBeanObjectPropertyBuilder().bean(article.name(“dateTime”).build();

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

为什么不将您的bean创建为JavaFXbean

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

为什么不将您的bean创建为javafxbean呢

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

最好的选择是在文本字段上使用:

// 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
上指定一个过滤器,将编辑限制为仅在该上下文中有意义的字符(尽管其细节可能有点棘手)。有关详细信息,请参阅文档。

最好的选择是在文本字段中使用:

// 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
上指定一个过滤器,将编辑限制为仅在该上下文中有意义的字符(尽管其细节可能有点棘手)。有关详细信息,请参阅文档。

当您尝试编辑文本字段时,这不会消失吗?它将尝试在每次文本更改时解析日期/时间,因此在编辑时会有大量无效值。您只需要解析commit.Hmmm.上的值。。不确定-我使用一个专门的转换器来处理几种不同的格式,因此这对我来说不是问题。但是,我相信这是处理这些项目的标准方法。当您尝试编辑文本字段时,这不会消失吗?它将尝试在每次文本更改时解析日期/时间,因此在编辑时会有大量无效值。您只需要解析commit.Hmmm.上的值。。不确定-我使用一个专门的转换器来处理几种不同的格式,因此这对我来说不是问题。但是,我相信这是处理这些项目的标准方法。您能告诉我如何将objectProperty(来自我的示例)绑定到tableColumn吗?或者我应该问一个新问题吗?对于表列,只需将cell value属性设置为直接映射到该属性。例如,您有
TableColumn列
column.setCellValueProperty(cellData->new JavaBeanObjectPropertyBuilder().bean(cellData.getValue()).name(“dateTime”).build()。(当然,如果您直接在bean中使用JavaFX属性而不是适配器,这会容易得多。)如果您需要表格单元格可编辑,只需使用带有转换器的
TextFieldTableCell
(转换器与任一答案相同)。非常感谢您的回答,但是我在TableColumn中没有方法
setCellValueProperty
。对不起,
setCellValueFactory
非常感谢!它起作用了。我唯一看不到的是如何像对TextField那样添加XStringConverter:
myTextField.textProperty().bindBidirectional(article.dateTimeProperty(),new LocalDateTimeStringConverter())。如何将XStringConverter添加到TableColumn?您能告诉我如何将objectProperty(来自我的示例)绑定到TableColumn吗?或者我应该问一个新问题吗?对于表列,只需将cell value属性设置为直接映射到该属性。例如,您有
TableColumn列
column.setCellValueProperty(cellData->new JavaBeanObjectPropertyBuilder().bean(cellData.getValue()).name(“dateTime”).build()。(当然,如果您直接在bean中使用JavaFX属性而不是适配器,这会容易得多。)如果您需要表格单元格可编辑,只需使用带有转换器的
TextFieldTableCell
(转换器与任一答案相同)。非常感谢您的回答,但是我在TableColumn中没有方法
setCellValueProperty
。对不起,
setCellValueFactory
非常感谢!它起作用了。我唯一看不到的是如何像对TextField那样添加XStringConverter:
myTextField.textProperty().bindBidirectional(article.dateTimeProperty(),new LocalDateTimeStringConverter())。如何将XStringConverter添加到TableColumn?