Я работаю над проектом, в котором мне нужно использовать SWT DateSpinner на веб-странице приложения RAP. Я перенес весь API Datespinner в свой проект и внес изменения, чтобы приспособить его к приложению. Я пытаюсь разместить виджет календаря, когда пользователь щелкает в любом месте страницы за пределами раскрывающегося списка календаря.
Чтобы добиться этого, я попытался добавить прослушиватель фокуса к виджету и счетчику фактической даты, но метод onFocusLost() никогда не выполняется всякий раз, когда счетчик даты или составной календарь теряют фокус. Я также попытался добавить прослушиватель событий мыши, где я пытаюсь удалить виджет, если событие нажатия мыши происходит за пределами составных границ календаря, но это также не выполняется. Метод showCalendar() выглядит следующим образом:
private void showCalendar()
{
if (calendarDropDown != null && !calendarDropDown.isDisposed())
{
calendarDropDown.dispose();
}
calendarDropDown = new DropDown(this);
calendarDropDown.setUsingRelativeControlWidth(false);
Composite composite = calendarDropDown.getDropDown();
composite.setLayout(new FillLayout());
composite.setData(calendarToggle);
Calendar c = Calendar.getInstance();
Date date = this.getDate();
// get current date in the control
if (date != null)
{
c.setTime(this.getDate());
}
CalendarComposite calendarWidget = new CalendarComposite(composite, c);
calendarWidget.setNoneEnabled(this.allowNullDate);
calendarWidget.setMinimumDate(dateToCalendar(getMinimum()));
calendarWidget.setMaximumDate(dateToCalendar(getMaximum()));
// background to match the calendar
composite.setBackground(calendarWidget.getBackground());
calendarDropDown.show(true, composite.computeSize(SWT.DEFAULT, SWT.DEFAULT));
text.addFocusListener(new FocusListener()
{
@Override
public void focusLost(FocusEvent event)
{
dispose();
}
@Override
public void focusGained(FocusEvent event)
{
// TODO Auto-generated method stub
}
});
calendarWidget.addMainCalendarListener(new CalendarListenerAdapter()
{
@Override
public void dateChanged(Calendar date)
{
doSetDate(date != null ? date.getTime() : null, false, true);
}
@Override
public void popupClosed()
{
calendarDropDown.dispose();
}
});
}
И метод show DropDown
if ((autoHide && !dropDownShell.isVisible())){
dropDownShell.addMouseListener(new MouseListener()
{
@Override
public void mouseUp(MouseEvent e)
{
// TODO Auto-generated method stub
}
@Override
public void mouseDown(MouseEvent e)
{
if (!isInside(e.x, e.y, dropDownShell.getDisplay().getBounds()))
{
dispose();
}
}
@Override
public void mouseDoubleClick(MouseEvent e)
{
// TODO Auto-generated method stub
}
});
Пожалуйста, дайте мне знать, что я могу сделать, чтобы CalendarWidget избавлялся от потери фокуса.
DateSpinner
. Это сторонний компонент? Можете дать ссылку? Вместо того, чтобы загружать весь проект в виде zip-файла, не могли бы вы процитировать здесь соответствующие части? - person ralfstx   schedule 15.07.2015