Калитка - заменить метку на TextField и наоборот - PullRequest
2 голосов
/ 04 апреля 2011

Я пытаюсь заменить метку на TextField в ListView. Несколько недель назад я видел похожий пример с калиткой в ​​Интернете, но ссылку не помню. Я добавил AjaxEventBehavior - «onDblClick» в ListItem, с помощью которого я хочу заменить метку на TextField, а также добавил AjaxFormComponentUpdatingBehavior - «onBlur» в TextField, так что TextField будет заменен на Label. Как-то это не работает. Модель List для ListView содержит только {"aaaaaaaaaaaaa", "bbbbbbbbbbbbbbbb", "cccccccccccccc"} [как я это проверяю], поэтому первая метка будет "aaaaaaaaaaaaa", если я дважды щелкну на этой метке место метки «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>

Любая информация или пример кода будут очень полезны для меня. Спасибо. Изменить: Я нашел ссылку: пример , но исходный код недоступен.

Ответы [ 3 ]

4 голосов
/ 04 апреля 2011

Вы можете заменить весь компонент, но вы также должны учитывать, что одна и та же разметка может не работать как для метки, так и для текстового поля. Но вы всегда можете заменить фрагмент другим фрагментом, поэтому, если вы обернетесь своим полем и пометите каждый фрагмент фрагментом, вы сможете переключаться между ними в любое время.

Как бы то ни было, для этой цели лучше использовать выделенный компонент, я помню компонент поля Ajax в основных Wicket или Wicket Extensions, которые это делали. Называется AjaxEditableLabel

2 голосов
/ 05 апреля 2011

Пример, который вы пытаетесь запомнить, может быть этот пример редактируемой метки .

1 голос
/ 04 апреля 2011

Существует Visural Wicket библиотека, которая имеет ViewOrEdit компонент.Звучит примерно так, как вы ищете.

Компонент ListView, возможно, не является лучшей основой для формы.Смотри http://wicketinaction.com/2008/10/building-a-listeditor-form-component/

...