2016-06-22 2 views
2

У меня есть javafx.beans.property.ObjectProperty<Calendar>. Как изменить календарь, чтобы javafx регистрировал его, а вызывающие изменения вызывались?Как изменить объект свойства javafx-объекта, вызывающего сменить прослушиватели?

Так что, когда я пытаюсь установить календарное поле Calendar.YEAR есть лучшее решение, чем

Calendar c = duedateCalendar.get(); 
c.set(Calendar.YEAR,2017); 
duedateCalendar.set(c); 
+0

Что не так с методом, который вы продемонстрировали? Кроме того - что вы используете? 'LocalDate' может быть более подходящим. – Itai

ответ

9

Установка значения свойства будет не-оп, если значение вы передаете равно текущее значение, что в данном случае явно составляет:

Calendar c = duedateCalendar.get(); 
// c is now a copy of the reference held internally by duedateCalendar 

c.set(Calendar.YEAR,2017); 
// this updates the Calendar object referenced both by c and internally 
// by duedateCalendar. Since the YEAR field in Calendar is just a primitive, 
// and is not an observable value in the JavaFX sense, nothing is notified 
// of the change 

duedateCalendar.set(c); 
// the value passed to set here is equal (indeed identical) to the value 
// held internally by duedateCalendar (since it's an actual copy of the 
// same reference). Internally, duedateCalendar will compare the parameter 
// to the value it already holds, will see that they are the same, and 
// so will take no action (including not notifying listeners) 

Следовательно, никакие события изменений не будут уволены (ничего наблюдаемого на самом деле не изменилось).

Вы можете создать новый Calendar, представляющий новую дату и установить его в том, что:

Calendar c = duedateCalendar.get(); 
Calendar newDueDate = Calendar.getInstance(); 
newDueDate.setTime(c.getTime()); 
newDueDate.set(Calendar.YEAR, 2017); 
duedateCalendar.set(newDueDate); 

как в сторону, я настоятельно рекомендую использовать java.time API (например LocalDate или LocalDateTime) вместо устаревшего Calendar класса. Классы в этом API в значительной степени неизменяемы (поэтому они лучше работают с классами свойств JavaFX) и имеют функциональные методы, которые возвращают новые экземпляры соответствующих классов. Например, LocalDate является неизменным и имеет методы, такие как LocalDate.plusYears(...), которые возвращают ссылку на новый объект LocalDate. Так вы можете сделать:

// just create a random date sometime in 2016: 
Random rng = new Random(); 
LocalDate random2016Date = LocalDate.of(2016, 1, 1).plusDays(rng.nextInt(365)); 

// general listener for logging: 
ChangeListener<Object> listener = (obs, oldVal, newVal) -> System.out.println(oldVal + " -> " + newVal); 


ObjectProperty<LocalDate> date = new SimpleObjectProperty<>(random2016Date); 
date.addListener(listener); 

// add one year to the current date: 
date.set(date.get().plusYears(1)); 
Смежные вопросы