11

I created a link with static text. That works fine but now I also want to change the text when you click the link.

I got as far as this:

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

I hope you can give me some easy advice - I'm really new to this :)

Best regards Elias

Sean Patrick Floyd
  • 292,901
  • 67
  • 465
  • 588
Sylvus
  • 165
  • 1
  • 3
  • 7

6 Answers6

20

The HTML:

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

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

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

The 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")))

        );

    }

}

I tend to use wicket:container in order to not pollute the HTML with superfluous elements (the wicket:container won't be rendered in production)

Sean Patrick Floyd
  • 292,901
  • 67
  • 465
  • 588
8

you need to back the text in the link with its own model:

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

and in java:

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

better yet if you use a (Compound)PropertyModel and have a getLinktext() function the returns the text, depending on the state.

bert
  • 7,566
  • 3
  • 31
  • 47
8

No change to the html necessary:

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);
Thomas Schütt
  • 832
  • 10
  • 14
1

use the HTML tag as follow for your link and set the text in the property file for key in order to use it.

HTML:

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

Property:

label.LABLENAME        =YOUR OWN TEXT FOR LABLE!

Java:

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

Output would be a link label with the text specified in the property file. Simply change the corresponding text in properties to whatever text you want.

Smittey
  • 2,475
  • 10
  • 28
  • 35
0

Wicket can't change the text attribute of your link, so, add a new html component to do the hack.

I don't agree with this philosophy, and prefer to leave it to the man of the situation: 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();
    }
});

This way you don't need the additional label/span inside your <a> element.

You can modify your text from java if you need to. If you don't, just do it from javascript then.

Sebas
  • 21,192
  • 9
  • 55
  • 109
0

In our Wicket 6 project we use something like that:

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;
}
}

This component satisfy our needs.

sanluck
  • 1,544
  • 1
  • 12
  • 22