Создание модели для вашего ярлыка действительно Wicket Way . Тем не менее, вы можете упростить для себя время от времени функцию полезности. Вот один я использую:
/**
* Creates a resource-based label with fixed arguments that will never change. Arguments are wrapped inside of a
* ConvertingModel to provide for automatic conversion and translation, if applicable.
*
* @param The component id
* @param resourceKey The StringResourceModel resource key to use
* @param component The component from which the resourceKey should be resolved
* @param args The values to use for StringResourceModel property substitutions ({0}, {1}, ...).
* @return the new static label
*/
public static Label staticResourceLabel(String id, String resourceKey, Component component, Serializable... args) {
@SuppressWarnings("unchecked")
ConvertingModel<Serializable>[] models = new ConvertingModel[args.length];
for ( int i = 0; i < args.length; i++ ) {
models[i] = new ConvertingModel<Serializable>( new Model<Serializable>( args[i] ), component );
}
return new CustomLabel( id, new StringResourceModel( resourceKey, component, null, models ) );
}
Здесь я привожу подробности:
- Я создал свой собственный
ConvertingModel
, который будет автоматически преобразовывать объекты в их строковое представление на основе IConverters, доступных для данного компонента
- Я создал собственный
CustomLabel
, в котором применяется постобработка текста пользовательской метки (как подробно описано в в этом ответе )
Имея собственный IConverter для, скажем, объекта Temperature, вы можете получить что-то вроде:
Properties key:
temperature=The current temperature is ${0}.
Page.java code:
// Simpler version of method where wicket:id and resourceKey are the same
add( staticResourceLabel( "temperature", new Temperature(5, CELSIUS) ) );
Page.html:
<span wicket:id='temperature'>The current temperature is 5 degrees Celsius.</span>
Недостатком этого подхода является то, что у вас больше нет прямого доступа к классу Label, вы не можете создать его подкласс для переопределения isVisible()
или подобных вещей. Но для моих целей это работает в 99% случаев.