SWT FocusListener focusLost() никогда не вызывается

#java #swt #listener

#java #swt #прослушиватель

Вопрос:

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

 myComposite = new MyComposite(myGroup, myEditor, getModel(), SWT.NONE,
            calculator, this, application, modelService, partService, progressService, shell);
    myComposite.setLayout(new GridLayout(2, false));
    GridDataFactory.swtDefaults().span(21, 1).grab(true, true).align(SWT.FILL, SWT.TOP).applyTo(myComposite);
    
    FocusListener focusListener = new FocusListener() {
        @Override
        public void focusLost(FocusEvent e)
        {
            if (myComposite.getErrorMessage() != null) {
            getValidator().getDecorator().setError(myComposite, myComposite.getErrorMessage());
            }
        }

        @Override
        public void focusGained(FocusEvent e) { /** nothing */  }
    };
    
myComposite.addFocusListener(focusListener);

    
 

Ответ №1:

Хотя этот вопрос очень старый, я попытаюсь подсказать, что могло пойти не так.

У меня недостаточно кода в вопросе, чтобы точно определить причину, но распространенным случаем является то, что дочерние элементы Composite имеют фокус, а не родительский. Вот почему этот внешний составной элемент может не генерировать события фокусировки — он вообще не работает в цикле событий. Итак, я могу предложить использовать проверки потери фокуса для внутренних элементов, например, так:

 entireElement.addListener(SWT.FocusOut, event -> {
    // put element validation mechanics here
});