To use ProgressiveDisplay like this, here is all you do:
Behind the scenes, this is what it does:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<!-- We need a doctype to allow us to use special characters like   
     We use a "strict" DTD to make IE follow the alignment rules. -->
     
<html xmlns:t="http://tapestry.apache.org/schema/tapestry_5_4.xsd">
<body class="container">
    <h3>ProgressiveDisplay</h3>
    <noscript class="js-required">
        ${message:javascript_required}
    </noscript>     
    The ProgressiveDisplay component lets you run an operation in the background, 
    auto-updating the page when it has finished, like this...<br/>
    <div class="eg">
        <t:progressivedisplay t:id="showThings">
            <t:loop source="things" value="thing" element="div">
                ${thing}
            </t:loop>
        </t:progressivedisplay>
    </div>  
    <p>To use ProgressiveDisplay like this, here is all you do:</p>
    <ol>
        <li>In the template, wrap ProgressiveDisplay around the eventual output of your operation.</li>
        <li>In the class, put the operation in a method that handles the PROGRESSIVE_DISPLAY event.</li>
    </ol>
    <p>Behind the scenes, this is what it does:</p>
    <ul>
        <li>As the page renders, ProgressiveDisplay ignores its body, renders "Loading..." instead, and adds some javascript to the page.</li>
        <li>When the browser displays the page, we see "Loading..." and the javascript sends an AJAX request to our page's ProgressiveDisplay.</li>
        <li>ProgressiveDisplay bubbles up a PROGRESSIVE_DISPLAY event which is caught by our page's event handler <em>onProgressiveDisplay()</em>.</li>
        <li>ProgressiveDisplay renders its body - our list of "things" - and returns it in an AJAX response.</li>
        <li>The browser partially updates the page: it replaces "Loading..." with the list of "things".</li>
    </ul>
    References: 
    <a href="http://tapestry.apache.org/5.4/apidocs/org/apache/tapestry5/corelib/components/ProgressiveDisplay.html">ProgressiveDisplay</a>.<br/><br/> 
    
    <t:pagelink page="Index">Home</t:pagelink><br/><br/>
    
    <t:tabgroup>
        <t:sourcecodetab src="/web/src/main/java/jumpstart/web/pages/examples/ajax/ProgressiveDisplay.tml"/>
        <t:sourcecodetab src="/web/src/main/java/jumpstart/web/pages/examples/ajax/ProgressiveDisplay.java"/>
        <t:sourcecodetab src="/web/src/main/resources/META-INF/assets/css/examples/js.css"/>
    </t:tabgroup>
</body>
</html>
package jumpstart.web.pages.examples.ajax;
import org.apache.tapestry5.annotations.Import;
import org.apache.tapestry5.annotations.Property;
@Import(stylesheet = "css/examples/js.css")
public class ProgressiveDisplay {
    static final private String[] ALL_THINGS = { "Sugar", "Spice", "All Things Nice" };
    // Screen fields
    @Property
    private String[] things;
    @Property
    private String thing;
    // The code
    void onProgressiveDisplay() {
        // Set up the list of things to display
        things = ALL_THINGS;
        // Sleep 4 seconds to simulate a long-running operation
        sleep(4000);
    }
    private void sleep(long millis) {
        try {
            Thread.sleep(millis);
        }
        catch (InterruptedException e) {
            // Ignore
        }
    }
}
.eg {
                margin: 20px 0;
                padding: 14px;
                color: #888;
                border: 1px solid #ddd;
                border-radius: 6px;
                -webkit-border-radius: 6px;
                -mox-border-radius: 6px;
}
.js-required {
                color: red;
                display: block;
                margin-bottom: 14px;
}
.js-recommended {
                color: red;
                display: block;
                margin-bottom: 14px;
}