Java Wicket-用TextField替换标签,反之亦然

Java Wicket-用TextField替换标签,反之亦然,java,wicket,Java,Wicket,我试图用ListView中的文本字段替换标签。几周前,我在互联网上看到了一个类似的wicket示例,但我不记得链接了。我已经将AjaxEventBehavior-“onDblClick”添加到列表项中,我想用文本字段替换标签,还将AjaxFormComponentUpdateingBehavior-“onBlur”添加到文本字段中,这样文本字段将被标签替换。不知怎的,它不起作用了。ListView的列表模型只包含{“aaaaaaaaaaaaaaaaa”,“bbbbbbbbbbbbbbbbbbbb

我试图用ListView中的文本字段替换标签。几周前,我在互联网上看到了一个类似的wicket示例,但我不记得链接了。我已经将AjaxEventBehavior-“onDblClick”添加到列表项中,我想用文本字段替换标签,还将AjaxFormComponentUpdateingBehavior-“onBlur”添加到文本字段中,这样文本字段将被标签替换。不知怎的,它不起作用了。ListView的列表模型只包含{“aaaaaaaaaaaaaaaaa”,“bbbbbbbbbbbbbbbbbbbbcccccc”}[我正在测试它],因此第一个标签将是“aaaaaaaaaaa”,如果我双击这个标签,文本字段将出现在标签“cccccccccc”的位置,这是出乎意料的。而且“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);
        }       
    }
}


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

有一个包含组件的库。听起来像是你在找的东西


ListView组件可能不是表单的最佳基础。请参阅

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


不过,最好使用专用组件来实现这一目的,我似乎记得核心Wicket或Wicket扩展中的Ajax字段组件实现了这一点。它被称为

您试图记住的示例可能是。

谢谢您的回复。有没有办法用另一个组件替换一个组件?谢谢。我来看看。Wicket扩展的Maven依赖性:
<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>