如何更改Wicket中的链接文本?

时间:2010-07-14 07:44:26

标签: java event-handling hyperlink wicket

我创建了一个包含静态文本的链接。这很好但现在我也想在你点击链接时更改文字。

我得到了这个:

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

我希望你能给我一些简单的建议 - 我对此很陌生:)

祝你好运 利亚

6 个答案:

答案 0 :(得分:18)

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(wicket:容器不会在生产中呈现)

答案 1 :(得分:8)

您需要使用自己的模型支持链接中的文本:

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

并在java中:

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

更好的是,如果使用(复合)PropertyModel并使用getLinktext()函数,则返回文本,具体取决于状态。

答案 2 :(得分:7)

不需要更改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);

答案 3 :(得分:0)

  

Wicket无法更改链接的text属性,因此,添加一个新的html组件来执行hack。

我不同意这种理念,而是倾向于将其留给情况的人: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那里开始吧。

答案 4 :(得分:0)

在我们的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;
}
}

该组件满足我们的需求。

答案 5 :(得分:0)

使用HTML标记作为您的链接,并在属性文件中设置密钥以便使用它。

HTML:

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

属性:

label.LABLENAME        =YOUR OWN TEXT FOR LABLE!

爪哇:

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

输出将是一个链接标签,其中包含属性文件中指定的文本。 只需将属性中的相应文本更改为您想要的任何文本。