Wicket - 如何在DropDownChoice中使用SelectOption?

时间:2017-06-26 20:02:20

标签: java wicket dropdownchoice

我想在多个位置使用一个设置。我需要得到并设置一个Integer值:0,1,2,-1。不存储显示的字符串。

html的片段:

<select wicket:id="thingPref">
    <option>1</option>
    <option>2</option>
</select>

Java的片段。

import org.apache.wicket.extensions.markup.html.form.select.SelectOption;
import org.apache.wicket.markup.html.form.DropDownChoice;

private SelectOption thingPreference; 

private void buildCommon()
{
    thingPreference = new SelectOption(Integer.toString(setting()), new Model<String>("dummy"));
    List<SelectOption> prefChoices = new ArrayList<SelectOption>();
    prefChoices.add(new SelectOption<String>("0", new Model<String>("Current Thing")));
    prefChoices.add(new SelectOption<String>("1", new Model<String>("One Prior Thing")));
    prefChoices.add(new SelectOption<String>("2", new Model<String>("Two Prior Things")));
    prefChoices.add(new SelectOption<String>("-1", new Model<String>("All Things")));
    DropDownChoice<SelectOption> prefselect = new DropDownChoice<SelectOption>("thingPref", 
            new PropertyModel<SelectOption>(this, "thingPreference"), prefChoices)
    {
        private static final long serialVersionUID = 1L;

        protected boolean wantOnSelectionChangedNotifications()
        {
            return true;
        }

        protected void onSelectionChanged(final String newSelection)
        {
            System.out.format("onSelectionChanged(%s)%n", newSelection);
        }
    };
    prefselect.setNullValid(false);
    prefselect.setRequired(true);
    add(prefselect);
}

开发者工具显示类似这样的HTML

<option value="3">[SelectOption [Component id = -1]]</option>

当我需要时

<option value="-1">All Things</option>

解决方案看起来不像添加渲染器那么简单,我不确定该设置应该使用枚举。我正在使用Wicket 7.6。有什么想法吗?

2 个答案:

答案 0 :(得分:0)

org.apache.wicket.extensions.markup.html.form.select.SelectOption应与org.apache.wicket.extensions.markup.html.form.select.Select一起使用,而不应与org.apache.wicket.markup.html.form.DropDownChoice一起使用。

对于您的使用案例,您可以使用DropDownChoiceSelect。在这两种情况下,您都需要自定义IChoiceRenderer

当您需要对每个选项进行更多控制时,

Select应优先于DropDownChoiceDropDownChoice使用POJO列表。

答案 1 :(得分:0)

我应用了自定义渲染器来显示数据选项。

private static final List<Integer> TermSettings = Arrays.asList(0, 1, 2, -1);

ChoiceRenderer<Integer> choiceRenderer = new ChoiceRenderer<Integer>()
{
    private static final long serialVersionUID = 1L;

    @Override
    public Object getDisplayValue(Integer value)
    {
        switch (value)
        {
            case 0:
                return "Current Term";
            case 1:
                return "One Prior Term";
            case 2:
                return "Two Prior Terms";
            case -1:
                return "All Terms";
            default:
                throw new IllegalStateException(value + " is not mapped!");
        }
    }

    @Override
    public String getIdValue(Integer object, int index)
    {
        Integer idvalue = TermSettings.get(index);
        String strvalue = String.valueOf(idvalue);
        return strvalue;
    }
};