Вы можете сделать это, получая модель из компонента, получая объект из модели и внося любые необходимые изменения в объект, но onComponentTag
не лучшее место для работы, которая меняет модель.
Этот метод вызывается во время процесса рендеринга в тот момент, когда ваша страница может быть частично отрисована. Любая часть страницы, которая уже была отображена, будет отображена с предыдущим состоянием модели. Поскольку модели могут совместно использоваться компонентами, полученная страница может быть несовместимой.
Если вы пытаетесь изменить визуализированное тело, это другая история, и совершенно разумная работа для этого метода. Обычно это вызывает вызов методов для параметра ComponentTag tag
.
Какую проблему вы пытаетесь решить, создавая такое поведение? Возможно, мы можем придумать лучший способ.
РЕДАКТИРОВАТЬ:
В конкретном случае обрезки дисплея на этикетке вам, вероятно, лучше обслужить, просто подклассифицируя компонент Label
примерно следующим образом:
public class TrimmedLabel extends Label {
private int size;
public TrimmedLabel(String id, int size) {
super(id);
this.size = size;
}
public TrimmedLabel(String id, String label, int size) {
super(id, label);
this.size = size;
}
public TrimmedLabel(String id, IModel model, int size) {
super(id, model);
this.size = size;
}
@Override
protected void onComponentTagBody(MarkupStream markupStream, ComponentTag openTag) {
String value = getModelObjectAsString();
if (value.length() > size) {
value = value.substring(0, size);
}
replaceComponentTagBody(markupStream, openTag, value);
}
}