Reputation: 165
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
Upvotes: 11
Views: 16856
Reputation: 11
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.
Upvotes: 1
Reputation: 1554
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.
Upvotes: 0
Reputation: 949
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);
Upvotes: 10
Reputation: 21542
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.
Upvotes: 0
Reputation: 299148
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)
Upvotes: 20
Reputation: 7696
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.
Upvotes: 8