Java-Gaming.org Java4K winners: [ by our judges | by the community ]         
Featured games (67)
games approved by the League of Dukes
Games in Showcase (∞)
games submitted by our members



News: Read the Java Gaming Resources, or peek at the official Java tutorials
 
    Home     Help   Search   Login   Register   
Pages: [1]
  Print  
  Applet custom download progress screen  (Read 811 times)
0 Members and 1 Guest are viewing this topic.
Offline MonsterOfCookie

JGO n00b
*

Posts: 25
Medals: 4


Gar


« on: 2011-03-07 18:52:06 »

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.

1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  
20  
21  
22  
23  
24  
25  
26  
27  
28  
29  
30  
31  
32  
33  
34  
35  
36  
37  
38  
39  
40  
41  
42  
43  
44  
45  
46  
47  
48  
49  
50  
51  
52  
53  
54  
55  
56  
57  
58  
59  
60  
61  
62  
63  
64  
65  
66  
67  
68  
69  
70  
71  
72  
73  
74  
75  
76  
77  
78  
79  
80  
81  
82  
83  
84  
85  
86  
87  
88  
89  
90  
91  
92  
93  
94  
95  
96  
97  
98  
99  
100  
101  
102  
103  
104  
105  
106  
107  
108  
109  
110  
111  
112  
113  
114  
115  
116  
117  
118  
119  
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

1  
2  
3  
4  
5  
6  
7  
<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


Offline Eli Delventhal
« League of Dukes »

JGO Kernel
*****

Posts: 3573
Medals: 44


Game Engineer


« Reply #1 on: 2011-03-08 13:39:31 »

Excellent resource. Thanks!

See my work:
OTC Software
<br />
Currently Working On:
Secret project...
Quote from: _Riven
I edit JGO in production, because I simply don't waste time writing bugs
Pages: [1]
  Print  
 
 
Jump to:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.16 | SMF © 2011, Simple Machines Valid XHTML 1.0! Valid CSS!
Page created in 0.093 seconds with 20 queries.