JavaFX:适配器、ObjectProperty和双向绑定
我想了解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
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?