#java #wicket
#java #калитка
Вопрос:
Допустим, у меня есть следующая настройка.
public class TextPanel extends Panel {
public TextPanel(String id) {
this(id, null);
}
public TextPanel(String id, IModel<?> model) {
super(id, model);
add(new Label("text", model));
}
}
Каков наилучший способ поддерживать модель метки в актуальном состоянии. Я могу придумать два способа, но я не уверен, есть ли какие-либо недостатки или лучшие способы.
Переопределение onModelChanged
и вызов get("text").setDefaultModel(getDefaultModel())
или реализация (новой?) модели.
public class DefaultComponentModel implements IModel<Object> {
private final Component component;
public DefaultComponentModel(Component component) {
this.component = component;
}
@Override
public Object getObject() {
return component.getDefaultModelObject();
}
public void setObject(Object object) {
component.setDefaultModelObject(object);
}
}
И использовать его для метки. ( new Label("text", new DefaultComponentModel(this))
)
Важно то, что решение должно работать при изменении defaultModel компонента или использовании CompoundPropertyModel.
Ответ №1:
Я бы заменил this(id, null);
на this(id, Model.of(""));
. Таким образом, вы можете обновить объект модели TextPanel (например textPanel.setModelObject("new text")
), и это автоматически обновит метку.
Если вы установите новую модель (т. Е. textPanel.setModel(newModel)
Тогда вам придется переопределить метод TextPanel#setModel() и вызвать get("text").setModel(newModel)
тоже.
Комментарии:
1. Почему-то я всегда думал, что
setDefaultModel(model)
это окончательно. Но теперь, когда я знаю, что это не окончательное, просто переопределение кажется лучшим подходом. Единственным недостатком является то, что CompoundPropertyModel не работает.