【问题标题】:Wicket - Replace Label By TextField and vice versaWicket - 用 TextField 替换标签,反之亦然
【发布时间】:2011-04-04 16:18:00
【问题描述】:

我正在尝试用 ListView 中的 TextField 替换 Label。几周前我在互联网上看到了一个类似的检票口示例,但我不记得链接了。我已将 AjaxEventBehavior - “onDblClick”添加到 ListItem 中,我想通过它用 TextField 替换 Label,并且还将 AjaxFormComponentUpdatingBehavior - “onBlur”添加​​到 TextField 中,以便 TextField 将被 Label 替换。不知何故,它不工作。 ListView 的 List 模型仅包含 {"aaaaaaaaaaaaaa", "bbbbbbbbbbbbbbbbbb", "cccccccccccccc"} [我正在测试它] 所以第一个标签将是 "aaaaaaaaaaaaaa",如果我双击这个标签,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 但源代码不可用。

【问题讨论】:

    标签: java wicket


    【解决方案1】:

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

    但是,为此目的最好使用专用组件,我似乎记得核心 Wicket 或 Wicket Extensions 中的 Ajax 字段组件可以做到这一点。它被称为AjaxEditableLabel

    【讨论】:

    【解决方案2】:

    你想记住的例子可能是this editable label example

    【讨论】:

      【解决方案3】:

      有一个 Visural Wicket 库,其中包含 ViewOrEdit 组件。听起来像您正在寻找的东西。

      ListView 组件可能不是表单的最佳基础。见http://wicketinaction.com/2008/10/building-a-listeditor-form-component/

      【讨论】:

      • 感谢您的回复。有没有办法用另一个组件替换一个组件?
      猜你喜欢
      • 2019-12-27
      • 2019-03-17
      • 1970-01-01
      • 1970-01-01
      • 2020-07-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多