Калитка: Компонент для эталонной модели из содержащей Panel - PullRequest
4 голосов
/ 11 января 2012

Чтобы проиллюстрировать мою проблему, скажем, у меня есть экземпляр Thing, у которого есть два свойства текста - 'foo' и 'bar'.

Я хочу создать панель для редактирования экземпляров Thing. На панели есть два компонента TextField, один для свойства 'foo' и один для свойства 'bar'.

Я хочу иметь возможность вызывать setDefaultModel() на моей панели с экземпляром IModel<Thing> и компонентами TextField для ссылки на эту модель. Как лучше всего этого добиться?

Должен ли я переопределить метод Panel.setDefaultModel(), чтобы он также вызывал setModel () для двух компонентов TextField? Или, возможно, создать анонимные ReadOnlyModels для компонентов TextField, переопределив метод getObject() для извлечения объекта из модели Panel, содержащей его?

Ничто из этого не кажется мне очень элегантным, поэтому мне было интересно, есть ли лучший способ?

Ответы [ 3 ]

3 голосов
/ 11 января 2012

Вы можете использовать PropertyModel для текстовых полей. Передайте IModel<Thing> в конструктор PropertyModel с foo в качестве имени свойства:

add(new TextField("fooFieldId", new PropertyModel(thingModel, "foo")));

PropertyModel выяснит, что thingModel является Model и вызовет getObject().getFoo() и т. Д.

Предполагается, что экземпляр IModel<Thing> не изменяется, только его базовый объект, который можно изменить, вызывая setDefaultModelObject.

0 голосов
/ 11 января 2013

Может быть, это поможет?

public abstract class AbstractWrapModel<T> extends Object implements IWrapModel<T>

Простой базовый класс для объектов IWrapModel.

См. IComponentAssignedModel или IComponentInheritedModel, чтобы вам не приходилось использовать пустые методы, такие как detach или setObject (), когда они не используются в оболочке. Метод detach вызывает упакованные модели detach.

0 голосов
/ 12 января 2012

Может быть, я просто упускаю суть, но я не могу найти Panel.setModel() в JavaDocs ни 1.4 , ни 1,5 .Если это что-то, что вы реализовали, возможно, вы могли бы изменить это, чтобы не заменить объект модели, а вместо этого вызвать model.setObject()?

Отказ от ответственности : Не могу проверить прямо сейчас, потому что неткалитка на работе, и моя домашняя машина перенесла поломку видеокарты ранее ...

...