Question

I have started to learn Apache Wicket web framework and I was having a bit of difficulty doing a task.

If you can see from the attached image , I went to http://www.wicket-library.com/wicket-examples-6.0.x/echo/ ,

to try out this basic input form functionality.

My question is : I don't want to show anything in the Label field initially, but once the set message button has been clicked, then I want to update the Label value. How do I do that ? Thanks

enter image description here

Updated :

The code in echo.java, is show below. A PropertyModel is attached with the Label which updates the value.

/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You under the Apache License, Version 2.0
 * (the "License"); you may not use this file except in compliance with
 * the License.  You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package org.apache.wicket.examples.echo;

import org.apache.wicket.examples.WicketExamplePage;
import org.apache.wicket.markup.html.basic.Label;
import org.apache.wicket.markup.html.form.Form;
import org.apache.wicket.markup.html.form.TextField;
import org.apache.wicket.model.PropertyModel;


/**
 * The simplest form application possible. Just prints any user input to a label.
 * 
 * @author Eelco Hillenius
 */
public class Echo extends WicketExamplePage
{
    private String message = "[type your message to the world here]";

    /**
     * Constructor.
     */
    public Echo()
    {
        // This model references the page's message property and is
        // shared by the label and form component
        PropertyModel<String> messageModel = new PropertyModel<String>(this, "message");

        // The label displays the currently set message
        add(new Label("msg", messageModel));

        // Add a form to change the message. We don't need to do anything
        // else with this form as the shared model is automatically updated
        // on form submits
        Form<?> form = new Form("form");
        form.add(new TextField<String>("msgInput", messageModel));
        add(form);
    }

    /**
     * @return the message
     */
    public String getMessage()
    {
        return message;
    }

    /**
     * @param message
     *            the message to set
     */
    public void setMessage(String message)
    {
        this.message = message;
    }
}

The html file looks like this :

<?xml version="1.0" encoding="UTF-8"?>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:wicket="http://wicket.apache.org">
<head>
    <title>Wicket Examples - echo</title>
    <link rel="stylesheet" type="text/css" href="style.css"/>
</head>
<body>
    <span wicket:id="mainNavigation"/>

    <form wicket:id="form">
        <input type="text" wicket:id="msgInput" value="" size="50" />
        <input type="submit" value="set message" />
    </form>
    <span wicket:id="msg" id="msg">Message goes here</span>

</body>
</html>
Was it helpful?

Solution

Try this:

add(new Label("msg", messageModel)) {
  @Override public boolean isVisible() {
    return !messageModel.getObject().equals(message);
  }
};

The text field needs to know when it should be rendered. Note that you need to set setOutputMarkupId(true) and setOutputMarkupPlaceholderTag(true) on the Label if you want to make the component visible via Ajax, i.e. the submit component is for example an AjaxSubmitButton.

When performing a more complex task than a String comparison, you should rather call setVisible from an overriden onConfigure method, as mentioned in the comments. isVisible might be called plenty of times during the rendering phase such that you want to avoid computations. This would look like the following:

add(new Label("msg", messageModel)) {
  @Override protected void onConfigure() {
    super.onConfigure();
    setVisible(!messageModel.getObject().equals(message));
  }
};

Never forget to call the super method, though.

In order to improve code readability, I personally prefer to override the isVisible method for easy tasks like the String comparison you require. The JIT compiler usually takes care of the rest.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top