【问题标题】:How to Create a dependable palette in Wicket如何在 Wicket 中创建可靠的调色板
【发布时间】:2014-06-24 06:02:25
【问题描述】:

我在 wicket 中创建了一个调色板,并且能够填充调色板左侧窗口。但我想让调色板中的选项是动态的,能够做到这一点。但问题是调色板没有填充选定的选项。 我在调色板上方有一个下拉菜单,具体取决于我要填充调色板的选项。

例如(带有值的下拉(角色)): 1.scenario: dropdown --> TL,Manager,SE,SSEpallete --> 初始不会有值,在创建角色TL时,会在仪式中选择技能调色板的窗口。假设 TL 角色是使用 10 个技能中的 4 个技能创建的。 2.scenario: 我想编辑角色 TL,在这种情况下,当我选择角色 TL 时,调色板应该被填充到这样的地方,选择应该在右边,可用应该在左边. 我在第二种情况下失败了。

代码如下:

public class DropDownChoicePage extends WebPage {
private String selectedMake;
private final Map<String, List<String>> modelsMap = new HashMap<String, List<String>>();
private List<String> selected = new ArrayList<String>();
private String selectedEngine = "Google";
public DropDownChoicePage(final PageParameters parameters) {
    add(new FeedbackPanel("feedback"));
    modelsMap.put("AUDI", Arrays.asList(new String[] { "A4", "A6", "TT" }));
    modelsMap.put("CADILLAC", Arrays.asList(new String[] { "CTS", "DTS", "ESCALADE", "SRX","DEVILLE" }));
    modelsMap.put("FORD", Arrays.asList(new String[] { "CROWN", "ESCAPE", "EXPEDITION","EXPLORER", "F-150" }));

    IModel<List<? extends String>> makeChoices = new AbstractReadOnlyModel<List<? extends String>>()
    {
        private static final long serialVersionUID = 1L;
        @Override
        public List<String> getObject()
        {
            Set<String> keys = modelsMap.keySet();
            List<String> list = new ArrayList<String>(keys);
            return list;
        }
    };
    IModel<List<? extends String>> paletteChoices = new AbstractReadOnlyModel<List<? extends String>>(){
        private static final long serialVersionUID = 1L;
        @Override
        public List<? extends String> getObject() {
            List<String> models = modelsMap.get(selectedMake);
            if (models == null)
            {
                models = Collections.emptyList();
            }else if("FORD".equals(selectedMake)){
                selected.add("CROWN");
                selected.add("ESCAPE");
            }
            return models;
        }
    };
    final DropDownChoice<String> makes = new DropDownChoice<String>("makes",new PropertyModel<String>(this, "selectedMake"), makeChoices);
    IChoiceRenderer<String> renderer = new ChoiceRenderer<String>();
    final Palette<String> palette = new Palette<String>("palette",
            new ListModel<String>(selected),
            paletteChoices,
            renderer, 10, true);
    palette.setOutputMarkupId(true);
    makes.add(new AjaxFormComponentUpdatingBehavior("onchange")
    {
        private static final long serialVersionUID = 1L;
        @Override
        protected void onUpdate(AjaxRequestTarget target)
        {
            selected = new ArrayList<String>();
            target.addComponent(palette);
            System.out.println("AjaxFormComponentUpdatingBehavior(\"onchange\")");
            System.out.println("Selected Make:"+selectedMake);
        }
    });
    Form<?> form = new Form<Void>("form") {
        private static final long serialVersionUID = 1L;
        @Override
        protected void onSubmit() {
            info("Selected search engine : " + selectedEngine);
            selected = new ArrayList<String>();
        }
    };
    add(form);
    form.add(palette);
    form.add(makes);
}
}

您能否在第二种情况下帮助我,即在下拉菜单的更改事件中使用可用和选定的值填充调色板的左右窗口。

谢谢, 萨兰。

【问题讨论】:

    标签: java wicket wicket-1.5 wicket-6 wicketstuff


    【解决方案1】:

    我认为您的代码中有两个主要问题会阻止第二种情况正常工作:

    (1)在onchange Ajax Behavior中,以下代码不会更新选中选项的ListModel:

    selected = new ArrayList<String>();
    

    试试这个:

    selected.clear();
    

    (2) 将已经选择的选项添加到列表中的代码应该在 Ajax Behavior 中,即:

    makes.add(new AjaxFormComponentUpdatingBehavior("onchange") {
        private static final long serialVersionUID = 1L;
        @Override
        protected void onUpdate(AjaxRequestTarget target) {
            selected.clear();
            List<String> alreadySelected = getAlreadySelectedChoicesBasedOnDropdownValue();
            selected.addAll(alreadySelected);
            //...
        }
    }
    

    getAlreadySelectedChoicesBasedOnDropdownValue 将返回已选择选项的新列表,例如:

    List<String> getAlreadySelectedChoicesBasedOnDropdownValue() {
        if("FORD".equals(selectedMake)){
            return Arrays.asList("CROWN", "ESCAPE");
        }
    }
    

    【讨论】:

    • 我尝试了同样的方法,但它不起作用:(。我在这里观察到的是,当我选择除 FORD 之外的选项时,paletteChoices 渲染逻辑只执行一次,这是预期的行为,但是当我选择 FORD 选项时,paletteChoices 正在执行三次,我很困惑为什么它会这样。
    猜你喜欢
    • 2017-05-23
    • 1970-01-01
    • 2021-11-23
    • 1970-01-01
    • 2013-07-02
    • 2021-06-15
    • 2011-11-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多