Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何修改调用change listeners的javafx对象属性的对象?_Java_Javafx_Javafx 8 - Fatal编程技术网

如何修改调用change listeners的javafx对象属性的对象?

如何修改调用change listeners的javafx对象属性的对象?,java,javafx,javafx-8,Java,Javafx,Javafx 8,我有一个javafx.beans.property.ObjectProperty。如何修改日历,以便javafx注册日历并调用更改侦听器 因此,当我尝试设置calendar字段calendar.YEAR时,有比 Calendar c = duedateCalendar.get(); c.set(Calendar.YEAR,2017); duedateCalendar.set(c); 如果您传递的值等于当前值,则设置属性值将是不可操作的,在本例中,当前值显然是: Calendar c = due

我有一个
javafx.beans.property.ObjectProperty
。如何修改日历,以便javafx注册日历并调用更改侦听器

因此,当我尝试设置calendar字段
calendar.YEAR
时,有比

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

如果您传递的值等于当前值,则设置属性值将是不可操作的,在本例中,当前值显然是:

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 c = duedateCalendar.get();
Calendar newDueDate = Calendar.getInstance();
newDueDate.setTime(c.getTime());
newDueDate.set(Calendar.YEAR, 2017);
duedateCalendar.set(newDueDate);
另外,我强烈建议使用(例如
LocalDate
LocalDateTime
)而不是传统的
Calendar
类。这个API中的类在很大程度上是不可变的(所以它们可以更好地处理JavaFX属性类),并且具有返回适当类的新实例的函数方法。例如,
LocalDate
是不可变的,并且具有返回对新
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));
//只需在2016年的某个时候创建一个随机日期:
随机rng=新随机();
LocalDate random2016Date=LocalDate.of(2016,1,1).plusDays(rng.nextInt(365));
//日志记录的通用侦听器:
ChangeListener侦听器=(obs,oldVal,newVal)->System.out.println(oldVal+“->”+newVal);
ObjectProperty日期=新的SimpleObjectProperty(random2016Date);
date.addListener(listener);
//将当前日期加上一年:
date.set(date.get().plusYears(1));

您演示的方法有什么问题?还有-您的用例是什么<代码>本地日期可能更合适。