gpt4 book ai didi

java - Wicket - 用文本字段替换标签,反之亦然

转载 作者:行者123 更新时间:2023-12-01 22:43:37 27 4
gpt4 key购买 nike

我正在尝试用 ListView 中的 TextField 替换标签。几周前我在互联网上看到了一个类似的 Wicket 口示例,但我不记得链接了。我已将 AjaxEventBehavior - “onDblClick” 添加到 ListItem,通过它我想用 TextField 替换 Label,并且还添加了 AjaxFormComponentUpdatingBehavior - “onBlur” 到 TextField,以便 TextField 将被 Label 替换。不知怎的,它不起作用。 ListView 的列表模型仅包含 {"aaaaaaaaaaaaa", "bbbbbbbbbbbbbbbb", "cccccccccccccc"} [正如我正在测试的],因此第一个标签将为“aaaaaaaaaaaaa”,如果我双击此标签,则 TextField 会出现标签“cccccccccccccc”的位置,这是意想不到的。而且“onBlur”事件也不起作用。希望我能解释一下这些问题。代码如下:

public class TaskTypeSettingsPage extends BasePage implements Serializable {
private String val;

public TaskTypeSettingsPage() {
add(new TaskTypeSettingsForm("form"));
}

public void setVal(String val) {
this.val = val;
}

public String getVal() {
return val;
}

private class TaskTypeSettingsForm extends Form {

private static final long serialVersionUID = 10058L;
private Fragment labelFragment;
private Fragment textFragment;

public TaskTypeSettingsForm(String id) {
super(id);
setOutputMarkupId(true);

ListView listView = new ListView("row", Arrays.asList("aaaaaaaaaaaaa", "bbbbbbbbbbbbbbbb", "cccccccccccccc")) {

@Override
protected void populateItem(ListItem item) {
String str = (String) item.getModelObject();
item.add(new Label("listLabel", str));
item.setOutputMarkupId(true);

labelFragment = new Fragment("frag", "labelFragment", this.getPage());
Label label = new Label("label", str);
label.setOutputMarkupId(true);
labelFragment.setOutputMarkupId(true);
labelFragment.add(label);
item.add(labelFragment);

textFragment = new Fragment("frag", "textFragment", this.getPage());
TextField text = new TextField("text", new PropertyModel(TaskTypeSettingsPage.this, "val"));
text.setOutputMarkupId(true);
textFragment.setOutputMarkupId(true);
textFragment.add(text);

item.add(new AjaxEventBehavior("onDblClick") {

@Override
protected void onEvent(AjaxRequestTarget target) {
labelFragment.replaceWith(textFragment);
labelFragment = textFragment;
target.addComponent(textFragment);
}
});
text.add(new AjaxFormComponentUpdatingBehavior("onBlur") {

@Override
protected void onUpdate(AjaxRequestTarget target) {
textFragment.replaceWith(labelFragment);
textFragment = labelFragment;
target.addComponent(labelFragment);
}
});
}
};
add(listView);
}
}
}

还有

<html>
<body>
<wicket:extend>
<div class="heading"><wicket:message key="extras.taskType" /></div>
<form wicket:id="form" autocomplete="off">
<table>
<tr wicket:id="row">
<td>
<span wicket:id="frag"></span>
</td>
</tr>
</table>

<wicket:fragment wicket:id="labelFragment"><span wicket:id="label"></span>
</wicket:fragment>
<wicket:fragment wicket:id="textFragment"><input type="text" wicket:id="text">
</wicket:fragment>
</form>
</wicket:extend>
</body>
</html>

任何信息或示例代码都会对我非常有帮助。谢谢。编辑:我找到了链接:example但源代码不可用。

最佳答案

您可以替换整个组件,但您还必须考虑到相同的标记可能不适用于标签和文本字段。但是您始终可以用另一个片段替换一个片段,因此如果您将字段和标签分别包装在一个片段中,则可以随时在它们之间切换。

不过,您最好使用专用组件来实现此目的,我似乎记得核心 Wicket 或 Wicket 扩展中的 Ajax 字段组件就是这样做的。它被称为AjaxEditableLabel

关于java - Wicket - 用文本字段替换标签,反之亦然,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5541315/

27 4 0