#java #eclipse #swt #eclipse-pde
#java #eclipse #swt #eclipse-pde
Вопрос:
Я использую Eclipse MessageManager
для предоставления сообщений об ошибках в случае неверного ввода. Например:
mmng.addMessage("textLength", "blah", null, IMessageProvider.ERROR, field);
Я делаю это дважды. Один раз внутри экземпляра ModifyListener
и один раз сразу после создания Text
поля, чтобы проверить ввод при загрузке.
MessageManager
Отображает ошибку в заголовке страницы, а также рядом с текстовым полем (декоратор) при вызове addMessage
метода внутри modifyEvent
метода дочернего экземпляра ModifyListener
. Однако при добавлении сообщения сразу после создания текстового поля будет отображаться только декоратор (в заголовке нет ошибок, говорящих о том, что «обнаружено n ошибок»).
Мне интересно, почему это происходит. Я протестировал это с Eclipse ProductEditor
, и на самом деле наблюдается аналогичное поведение. Ошибки не появятся в заголовке, если вы откроете .product
файл, в котором на первой странице ошибка (появится только декоратор). Однако при переключении на другие страницы, а затем переключении обратно на эту конкретную страницу появится ошибка в заголовке. К сожалению, на моей стороне это не так. Я был бы удовлетворен, если бы мог реализовать такое же поведение, хотя лучшим вариантом было бы автоматическое отображение ошибок в обоих местах, в заголовке и рядом с полем в качестве декоратора.
Я также пытался решить эту проблему, вызвав update()
метод MessageManager
экземпляра, но, к сожалению, это не решило загадку.
Кстати, я использую Eclipse Luna 2.
Ответ №1:
Я отладил MessageManager
класс и заметил следующее условие внутри update
метода:
if (form.getHead().getBounds().height == 0 || mergedList.isEmpty() || mergedList == null) {
form.setMessage(null, IMessageProvider.NONE);
return;
}
Кроме того, что NPE будет выдан при mergedList
значении null, это условие кажется мне действительно странным. Однако установка высоты заголовка решила мою проблему:
form.getForm().getHead().setBounds(0, 0, 0, 1);