需要一种策略来查找动态生成的下拉组件的属性

时间:2011-10-10 13:45:33

标签: java wicket

我需要为dropDownChoice组件设置空值字符串。 null选项的默认值是“Choose One”,它在Wicket AbstractSingleChoice类中是硬编码的。

通常的覆盖方法是定义属性资源。

但是我的DropdownChoice组件是在运行时动态生成的,并添加到面板(在数据表中)。 DropDownChoice没有在标记中专门引用。

我正在寻找有关如何在这种情况下以编程方式覆盖默认空值字符串的建议。如果DropDownChoice构造函数有一个额外的参数,那将是很好的。

我是否需要以编程方式创建新的属性资源?

希望这是有道理的。

2 个答案:

答案 0 :(得分:3)

您可以覆盖AbstractSingleSelectChoice.getNullKey()AbstractSingleSelectChoice.getNullValidKey(),以使Wicket从.properties或.xml文件中检索本地化资源,该文件没有组件ID作为密钥的一部分。这在JIRA问题中有记录:Open DropDownChoice null value internationalization key

例如:

DropDownChoice ddc = new DropDownChoice(id, model, choices){
   @Override
   protected String getNullKey(){ return "customDdcNullValue"; }
   @Override
   protected String getNullValidKey(){ return "customDdcNullValue"; }
}

将从<option>属性中检索customDdcNullValue的文本。

这些方法似乎已在版本1.4.4中添加,如果您使用的是1.3,则可以始终使用IChoiceRenderer DropDownChoice,在{的情况下返回正确的字符串null {1}}价值。请注意,您可以从资源(使用getString()StringResourceModel)检索它,或者在必要时从数据库/缓存中获取值。这可能取决于您如何本地化非空值的选择。

此外,您可以使用AbstractSingleSelectChoice.getDefaultChoice()的源代码以此行为推送您自己的DropDownChoice

更新:处理此问题的另一种方法是提供代表null或无选择的自定义值。只需记住在setNullValid(false)上使用DropDownChoice以阻止null在存在所选值时出现,并在您仍然不知道时使用您的无选择值初始化ddc的模型它的价值是为了避免Wicket在null电话中提供getDefaultChoice()

在为无选择选项定义值时,请特别注意AbstractSingleSelectChoice.getDefaultChoice()的这一部分:

// Null is not valid. Is it selected anyway?
if ((selected == null) || getNoSelectionValue().equals(selected) ||
      selected.equals(EMPTY_STRING))
{

考虑到getNoSelectionValue()返回-1,因此请不要将-1或空字符串用作自定义空值。我很难学到这一点,相信我,这并不令人愉快。

答案 1 :(得分:0)

您应该使用本地化功能来实现它。有一个方法org.apache.wicket.resource.loader.IStringResourceLoader.loadStringResource(org.apache.wicket.Component,java.lang.String),它返回一个字符串值以显示给定的组件。该字符串将是一个资源键,对于您的情况,它是“nullValid”字符串,IIRC。 因此,您可以实现自定义资源管理器,该管理器将从数据库而不是.properties文件中选择数据。