【问题标题】:Wicket DropDownChoice return integer from valueWicket DropDownChoice 从值返回整数
【发布时间】:2018-03-27 07:51:35
【问题描述】:

在这里,您可以看到检票口DropDownChoice 的工作示例,但这不是我想要的。下拉选择的返回值应该是与该值匹配的整数。 dropdownchoice的返回值为:

returnedLabel=123 (String)
returnedDDCValue=LabelValue [label=TestB, value=3] (LabelValue)

对于生产,returnedDDCValue 应该是一个整数,用 (integer) 3 填充。 我认为必须在 ddc 内部进行转换。我尝试使用IChoiceRenderer,但没有成功。 请帮助:)

干杯

克里斯

public class DDCTest extends Panel {

    private List<LabelValue> list4ddc;

    public DDCTest(String id) {
        super(id);
        Result result = new Result();

        final FeedbackPanel feedback = new FeedbackPanel("feedback");
        feedback.setOutputMarkupId(true);
        add(feedback);

        this.list4ddc = new ArrayList<LabelValue>();
        this.list4ddc.add(new LabelValue("TestA", 1));
        this.list4ddc.add(new LabelValue("TestB", 3));
        this.list4ddc.add(new LabelValue("TestC", 5));
        this.list4ddc.add(new LabelValue("TestD", 7));

        Form form = new Form("form");
        add(form);

        form.add(new TextField<String>("returnedLabel", new PropertyModel<String>(result,"returnedLabel")));

        form.add( new DropDownChoice("returnedDDCValue", new PropertyModel(result,"returnedDDCValue"), Model.of(list4ddc), new ChoiceRenderer("label", "value")));

        form.add(new AjaxButton("submit", form) {
            @Override
            protected void onSubmit(AjaxRequestTarget target) {
                info("["+result.toString()+"]");
                target.add(feedback);
            }
        });

    }

    public class Result implements Serializable {
        private String returnedLabel;
        private String returnedDDCValue;

        public Result() {
            super();
            this.returnedLabel = "";
            this.returnedDDCValue = null;
        }

        [ ... Getters and setters ... ]

    }

    public class LabelValue implements Serializable {
        private String label;
        private Integer value;

        public LabelValue(String label, Integer value) {
            super();
            this.label = label;
            this.value = value;
        }

        [ ... Getters and setters ... ]
    }
}

【问题讨论】:

  • 您的意思是要以特定方式呈现下拉菜单中的选项还是要更改下拉菜单的表单输入值?
  • 我的目标是基础对象 Result 中的属性 returnedDDCValue 的类型为 Integer,其值来自选择。 DDC 返回标签值。我在这里找到:cwiki.apache.org/confluence/display/WICKET/… ChoiceRenderer 将在呈现的 HTML 的 'value' 属性中使用 SelectOption 对象的 'key' 属性的值(例如,'key' 属性值将用作选项 id)。 'value' 属性将用作给定选项的显示值。与简单示例中的 String 相比,您的支持模型必须使用 SelectOption。
  • "你给一个DDC一个模型和一个可能值的列表。模型返回的对象类型和列表中的对象类型必须相同。如果你的模型返回一个Integer,所以你必须传递一个整数列表,而不是 IntegerSelectChoice 或其他任何东西。作为解决方法,我使用一个带有整数的列表作为 DDC,并从哈希映射中获取标签。我认为如果没有列表和哈希映射,它可能会更容易和集成。
  • 返回的属性DDCValue是String类型的,这怎么符合想要的Integer赋值呢?
  • 正如我所写的,这是一个工作示例。将其定义为整数是行不通的。我的目标是将它作为整数。看我最后的帖子。我找到了一种解决方法,但我对此并不满意。但你是对的。在生产版本中,DDC 和 ModelObject 将其声明为 Integer,并且 DDC 标签通过 HashMap 解析。在我看来,这不是一个优雅的解决方案......

标签: integer wicket dropdownchoice


【解决方案1】:

我想我已经做了一些与您需要的非常相似的事情。这是一个自定义 DDC,它使用选择的值来设置第三个模型:

public class DropDownChoiceForString<T> extends DropDownChoice<T> {

private IModel<String> targetModel;

public DropDownChoiceForString(String id, IModel<T> model, IModel<String> targetModel, 
        List<? extends T> choices,
        IChoiceRenderer<? super T> renderer) {
    super(id, model, choices, renderer);
    this.targetModel = targetModel;
}

protected DropDownChoiceForString(String id, IModel<T> model, IModel<String> targetModel) {
    this(id, model, targetModel, Collections.<T> emptyList(), null);
}

@Override
protected void onInitialize() {
    super.onInitialize();
    // load the initial choice.
    setModelObject(convertChoiceIdToChoice(targetModel.getObject()));
}

@Override
protected void onDetach() {
    super.onDetach();

    targetModel.detach();
}

@Override
protected void onModelChanged() {
    super.onModelChanged();

    T newSelection = getModelObject();

    int choiceIndex = getChoices().indexOf(newSelection);
    // update the string source with the selected value.
    targetModel.setObject(getChoiceRenderer().getIdValue(newSelection, choiceIndex));
}}

它的工作方式与标准 DDC 类似,但当其模型发生更改时,目标模型会更新为新选择的值。

【讨论】:

  • 嗨安德里亚,感谢分享。这就是我一直在寻找的。我会试一试。不错的解决方案,但它会更复杂。很酷!
  • 不客气!如果有用,请不要忘记投票支持我的答案;-)。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多