Установка значения свойства будет не-оп, если значение вы передаете равно текущее значение, что в данном случае явно составляет:
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));
Что не так с методом, который вы продемонстрировали? Кроме того - что вы используете? 'LocalDate' может быть более подходящим. – Itai