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