Applet custom download progress screen

Hey Guys,

I had was poking about the JDK documentation looking for how to do a custom download progress for an applet. I personally found it wasn’t straight forward and seeing as it turned out to be simple in the end, I thought I would share the results to save others some pain.

First Create your class that extends the DownloadServiceListener class. E.g.


package com.monsterofcookie.progress;

import javax.jnlp.DownloadServiceListener;
import java.awt.Container;
import java.net.URL;
import java.applet.AppletStub;
import java.awt.Canvas;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.image.BufferStrategy;

public class DownloadProgress implements DownloadServiceListener {

    private Container surfaceContainer = null;
    private AppletStub appletStub = null;
//
    private Canvas canvas = null;
    private BufferStrategy bufferStrategy = null;
//
    private final int CANVAS_WIDTH;
    private final int CANVAS_HEIGHT;
//

    public DownloadProgress(Object surface) {
        this(surface, null);
    }

    public DownloadProgress(Object surface, Object stub) {
        this((Container) surface, (AppletStub) stub);
    }

    private DownloadProgress(Container surface, AppletStub stub) {
        surfaceContainer = (Container) surface;
        appletStub = (AppletStub) stub;
        CANVAS_WIDTH = Integer.parseInt(appletStub.getParameter("width"));
        CANVAS_HEIGHT = Integer.parseInt(appletStub.getParameter("height"));
        initUI();
    }

    @Override
    public void downloadFailed(java.net.URL url, java.lang.String version) {
    }

    @Override
    public void progress(URL url, String version, long readSoFar, long total, int overallPercent) {
        updateProgressUI(overallPercent);
    }

    @Override
    public void upgradingArchive(URL url, String version, int patchPercent, int overallPercent) {
        updateProgressUI(overallPercent);
    }

    @Override
    public void validating(URL url, String version, long entry, long total, int overallPercent) {
        updateProgressUI(overallPercent);
    }

    private void initUI() {

        surfaceContainer.setIgnoreRepaint(true);
        surfaceContainer.setLayout(null);
        surfaceContainer.setBounds(0, 0, CANVAS_WIDTH, CANVAS_HEIGHT);
        canvas = new Canvas() {

            @Override
            public void addNotify() {
                super.addNotify();
                this.createBufferStrategy(2);
                bufferStrategy = this.getBufferStrategy();
            }

            @Override
            public void removeNotify() {
                super.removeNotify();
                bufferStrategy.dispose();
                bufferStrategy = null;
            }
        };
        surfaceContainer.add(canvas);
        canvas.setIgnoreRepaint(true);
        canvas.setSize(CANVAS_WIDTH, CANVAS_HEIGHT);
        canvas.setLocation(0, 0);

    }

    private void updateProgressUI(int overallPercentage) {
        if (bufferStrategy != null) {
            if (!bufferStrategy.contentsLost()) {
                bufferStrategy.show();
            }
            Graphics2D graphics2D = getGraphics2D();
            if (graphics2D != null) {
               
                try {

                    // TODO YOUR LOADING DRAWING

                } finally {
                    graphics2D.dispose();
                }
            }
        }
    }

    private Graphics2D getGraphics2D() {
        Graphics2D rtn = null;
        if (bufferStrategy != null) {
            rtn = (Graphics2D) bufferStrategy.getDrawGraphics();
            rtn.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
            rtn.setRenderingHint(RenderingHints.KEY_COLOR_RENDERING, RenderingHints.VALUE_COLOR_RENDER_QUALITY);
            rtn.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
            rtn.setRenderingHint(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY);
            rtn.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
            rtn.setClip(0, 0, CANVAS_WIDTH, CANVAS_HEIGHT);
        }
        return rtn;
    }
}

You will need to add the javaws.jar and plugin.jar to your classpath for compiling.

Finally (I did this with a jnlp file) amend your jnlp file (bet you didn’t see that coming :wink: ) with the following lines


<resources>
        <j2se version="1.6+" href="http://java.sun.com/products/autodl/j2se" />
	<jar href="AppletProgress.jar"  download="progress" />
// Other JARS
</resources>
<applet-desc progress-class="com.monsterofcookie.progress.DownloadProgress" /* other params */>
</applet-desc>

And voila… I hope this helps out someone else. TBH what will prolly happen is I will forget and find this in a Google search int 6 months time

Cookie

Excellent resource. Thanks!