gpt4 book ai didi

java - 如何在 Wicket 中创建可靠的调色板

转载 作者:行者123 更新时间:2023-11-30 11:17:22 24 4
gpt4 key购买 nike

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

例如(带有值的下拉列表(角色)):1.scenario: dropdown --> TL,Manager,SE,SSE pallete --> 一开始是没有值的,在创建角色TL的时候,在rite里面会选择技能调色板的窗口。假设 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);
}
}

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

谢谢,萨兰。

最佳答案

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

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

selected = new ArrayList<String>();

试试这个:

selected.clear();

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

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");
}
}

关于java - 如何在 Wicket 中创建可靠的调色板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24379357/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com