2017-01-04 2 views
0

Я хочу понять, как работает ObjectProperty, но все равно не повезло. У меня есть следующий POJO:JavaFX: адаптер, 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); 
    } 
} 

Теперь я создаю OBJECTPROPERTY для поля DATETIME:

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

А теперь я хочу, чтобы связать эту DateTimeProperty к textField.textProperty(). И я понятия не имею, как это сделать: как будут форматироваться данные для отображения dateTime в textField? Как экземпляр LocalDateTime будет создан при вводе нового времени в textField? У нас есть двунаправленная привязка. Пожалуйста, объясни.

ответ

1

Почему бы не создать свой компонент как 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()); 
+0

Не будет ли это умирать, когда вы попытаетесь отредактировать текстовое поле? Он попытается проанализировать дату/время при каждом изменении текста, поэтому во время редактирования у вас будет тонна недопустимых значений. Вам нужно только разобрать значение для фиксации. –

+0

Хммм .. Не уверен - я использую специализированный конвертер, который обрабатывает несколько разных форматов, поэтому для меня это не проблема. Однако я считаю, что это стандартный способ обработки этих элементов. –

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.

+0

Не могли бы вы сказать, как привязать objectProperty (из моего примера) к tableColumn? Или я должен задать новый вопрос? –

+0

Для столбца таблицы просто установите свойство свойства ячейки для непосредственного отображения свойства. То есть у вас есть столбец «Столбец» column' и 'column.setCellValueProperty (cellData -> новый JavaBeanObjectPropertyBuilder(). bean (cellData.getValue()). name (" dateTime ")). build());'. (Конечно, это намного проще, если вы используете свойства JavaFX непосредственно в своем компоненте вместо адаптеров.) Если вам нужна ячейка таблицы для редактирования, просто используйте «TextFieldTableCell» с конвертером (конвертер так же, как и для ответа) , –

+0

Большое спасибо за ваш ответ, но у меня нет метода 'setCellValueProperty' в TableColumn. –

Смежные вопросы