#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
});