Использование SWT DateSpinner с RAP не удаляет виджет календаря при потере фокуса

Я работаю над проектом, в котором мне нужно использовать 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 избавлялся от потери фокуса.


person AdM    schedule 14.07.2015    source источник
comment
Насколько мне известно, в SWT нет виджета с именем DateSpinner. Это сторонний компонент? Можете дать ссылку? Вместо того, чтобы загружать весь проект в виде zip-файла, не могли бы вы процитировать здесь соответствующие части?   -  person ralfstx    schedule 15.07.2015
comment
Я отредактировал основной вопрос с соответствующими частями кода.   -  person AdM    schedule 15.07.2015


Ответы (1)


Я думаю, что если виджет, на который вы фокусируетесь, находится в другой оболочке, чем текущий сфокусированный виджет (ваш текст), вы можете не получить событие focusLost, потому что каждая оболочка может иметь свой собственный сфокусированный виджет. На самом деле происходит то, что оболочка, в которой находится текст, деактивируется, о чем вы можете получить уведомление с помощью ShellListener.

person Tim Buschtöns    schedule 16.07.2015