Как изменить текст ссылки в Wicket?

Я создал ссылку со статическим текстом. Это прекрасно работает, но теперь я также хочу изменить текст при нажатии ссылки.

Я дошел до этого:

add(new Link("doAnything") {
    @Override
    public void onClick() {
            // change the text!
            // this.modelChanging();
            // this.detach();
    }
});

Надеюсь, вы можете дать мне легкий совет - я действительно новичок в этом:)

С уважением Элиас

Ответ 1

HTML:

<html><head></head><body>
<wicket:panel>

    <a href="" wicket:id="link">
        <wicket:container wicket:id="label" />
    </a>

</wicket:panel>
</body></html>

java:

public class MyPanel extends Panel{

    private static class Mybean{

        String labelText = "click me";

        public String getLabelText(){
            return this.labelText;
        }

        public void setLabelText(final String labelText){
            this.labelText = labelText;
        }

    }

    public MyPanel(final String id){
        super(id);
        final Mybean bean = new Mybean();
        this.add(new Link<Void>("link"){

            private static final long serialVersionUID = 1L;

            @Override
            public void onClick(){
                bean.setLabelText("Thanks for clicking");
            }
        }.add(new Label("label", new PropertyModel<String>(bean, "labelText")))

        );

    }

}

Я использую контейнер wicket: для того, чтобы не загрязнять HTML с лишними элементами (калитка: контейнер не будет отображаться в процессе производства)

Ответ 2

вам нужно вернуть текст в ссылку со своей собственной моделью:

<a wicket:id="doAnything"> <span wicket:id="linktext"/> </a>

и в java:

add(new Link("doAnything").add(new Label("linktext", Model.of("i 'm the text"));

еще лучше, если вы используете (Compound) PropertyModel и имеете функцию getLinktext(), возвращает текст в зависимости от состояния.

Ответ 3

Не требуется внесение изменений в html:

Link link = new Link("doAnything") {
    @Override
    public void onClick() {
            // change the text!
            // this.modelChanging();
            // this.detach();
    }
});
link.setBody(Model.of("visible link name"));

add(link);

Ответ 4

Wicket не может изменить текстовый атрибут вашей ссылки, поэтому добавьте новый html-компонент для взлома.

Я не согласен с этой философией и предпочитаю оставить ее человеку ситуации: javascript.

add(new AjaxLink("doAnything") {
    @Override
    public void onClick(final AjaxTarget t) {
            // change the text!
            t.appendJavaScript( "document.getElementById('idofyourlink').text = 'newtext';" );
            // this.modelChanging();
            // this.detach();
    }
});

Таким образом вам не понадобится дополнительная метка/интервал внутри вашего элемента <a>.

Вы можете изменить свой текст из java, если вам нужно. Если вы этого не сделаете, просто сделайте это из javascript.

Ответ 5

В нашем проекте Wicket 6 мы используем что-то вроде этого:

public abstract class AjaxLabeledLink extends AjaxLink {

private IModel<String> text = new Model<>();

public AjaxLabeledLink(String string) {
    super(string);
    this.text = new Model<>("");
}

public AjaxLabeledLink(String string, String linkText) {
    super(string);
    this.text = new Model<>(linkText);
}

public AjaxLabeledLink(String string, IModel<String> linkText) {
    super(string);
    this.text = linkText;
}

@Override
public IModel<?> getBody() {
    return text;
}

public IModel<String> getText() {
    return text;
}

public void setText(IModel<String> text) {
    this.text = text;
}
}

Этот компонент удовлетворяет наши потребности.

Ответ 6

используйте тег HTML, как показано ниже для вашей ссылки, и укажите текст в файле свойств для ключа, чтобы использовать его.

HTML:

<a wicket:id="doAnything"><wicket:message key="label.LABLENAME" /></a>

Свойство:

label.LABLENAME        =YOUR OWN TEXT FOR LABLE!

Java:

add(new BookmarkablePageLink<YOURCLASS>(
            "doAnything", YOURCLASS.class)));

Вывод будет ярлыком ссылки с текстом, указанным в файле свойств. Просто измените соответствующий текст в свойствах на любой текст, который вы хотите.