我有一个来自javafx导入的DatePicker。但是我需要它来包含Calendar属性,这就是为什么我创建了一个扩展DatePicker的自定义控件。
但是每次更改datepicker时都应该调用此属性,这就是为什么我认为在执行onAction事件时我必须使用.notify方法。这会抛出java.lang.IllegalMonitorStateException
例外。
这是我用于此自定义控件的代码:
public class DatePickerControl extends DatePicker
{
private ObjectProperty<Calendar> calendar;
public DatePickerControl() {
super();
setValue(LocalDate.now());
}
/**
* Get the value of calendar
*
* @return the value of calendar
*/
public ObjectProperty<Calendar> calendarProperty() {
Calendar calendar = new GregorianCalendar();
System.out.println("test");
calendar.set(getValue().getYear(), getValue().getMonthValue(), getValue().getDayOfMonth());
return new SimpleObjectProperty<>(calendar);
}
/**
* Set the value of calendar
*
* @param calendar new value of calendar
*/
public void setCalendar(Calendar calendar) {
this.calendar.set(calendar);
LocalDate ld = LocalDate.now();
ld.withYear(calendar.get(Calendar.YEAR));
ld.withMonth(calendar.get(Calendar.MONTH));
ld.withDayOfMonth(calendar.get(Calendar.DAY_OF_MONTH));
setValue(ld);
}
public Calendar getCalendar() {
return calendar.get();
}
}
我在哪里调用.notify():
dpAgendaRange.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent t) {
t.notify();
}
});
我是JavaFX的新手,所以如果代码不是很结构,我很抱歉。
答案 0 :(得分:1)
首先,notify()
没有按照您的想法行事。它是低级并发API的一部分,用于唤醒处于wait()阻塞状态的线程。你可以阅读这个here虽然它与你想要做的事情没有关系。
我认为您要做的是ObjectProperty<Calendar>
始终与DatePicker
的{{1}}中的日期值相匹配。
要做到这一点,只需按照常规方式定义valueProperty
:即只创建一次,并使用ObjectProperty<Calendar>
方法设置其值,setCalendar(...)
方法获取其值value,以及返回Property本身的getCalendar()
方法。
要维护calendarProperty()
与ObjectProperty<Calendar>
的{{1}}之间的绑定,只需为每个监听器注册一个监听器,并在其中任何一个更改时更新另一个监听器。
(另请注意,LocalDate和Calendar之间的月份编号不同。)
这样的事情:
valueProperty
一个简单的测试:
DatePicker