Диспетчер сообщений отображает сообщения только как декораторы полей, а не в заголовке

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