尝试进行自定义控制时,需要在对值进行更改时通知

时间:2014-04-06 09:10:08

标签: java datepicker javafx

我有一个来自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的新手,所以如果代码不是很结构,我很抱歉。

1 个答案:

答案 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