Her direkte taget fra
www.netcoders.dkHer er et lille trick, hvis du er træt af at se på den kedelige grå kasse, som 9 ud af 10 applets viser, mens de bliver initialiseret! - Dette er oftest et resultat af, at disse applet's loader en betydelig mængde grafik i initialiserings fasen.
Men for at undgå dette, er fidusen at man IKKE venter på at alt grafikken bliver loadet i Init() funktionen af appletten... Normalt ventes der med kaldet MediaTracker.waitForAll(), men da dette er et blokerende kald, stoppes initiliseringen af applet'en, indtil alt grafikken er blevet loadet!! - Derfor skal denne udelades, og til gengæld skal der indføres nogle status check på MediaTrackeren i applet'ens run() loop!
Indtil den nødvendige grafik er blevet loadet, vises en custom besked, for at informere brugeren om, at der loades grafik. I nedenstående er dette en simpel tekst streng, men dette kunne evt. udvides med en grafisk "progress" indikator, så brugeren kan se, hvor langt appleten er i forløbet!
Nedenstående er mit simple eksempel, som illusterer en af løsningerne på ovenstående problem :
// killGreyBox.java (oversat med Microsoft Visual J++ 1.1 )
//
// Udviklet af Kent Fonager, 29. September 1998
// Email : kent@netcoders.dk
import java.applet.*;
import java.awt.*;
import java.net.*;
public class killGreyBox extends Applet implements Runnable
{
// medlems variable
private Thread thread = null;
private Image m_image0;
private Image m_image1;
private Image m_image2;
private Image m_image3;
private boolean m_loaded = false;
private String m_message = "";
private MediaTracker m_mt;
public void init()
{
super.init();
// initializer strengene med filnavnene, på de filer som ønskes loadet
String gif0 = this.getCodeBase().toString() + "image0.jpg";
String gif1 = this.getCodeBase().toString() + "image1.jpg";
String gif2 = this.getCodeBase().toString() + "image2.jpg";
String gif3 = this.getCodeBase().toString() + "image3.jpg";
// custom message, som skal vises, mens der loades grafik
m_message = "Loader grafik...";
// initialiser image objekterne
try
{
m_image0 = this.getImage( new URL( gif0 ) );
m_image1 = this.getImage( new URL( gif1 ) );
m_image2 = this.getImage( new URL( gif2 ) );
m_image3 = this.getImage( new URL( gif3 ) );
}
catch (MalformedURLException e)
{
// udskriv fejlmeddelelse
System.out.println("Exception e : " + e.toString() );
}
// instantier MediaTracker
m_mt = new MediaTracker( this );
// tilføj de fire forskellige images til MediaTrackeren
m_mt.addImage( m_image0, 1 );
m_mt.addImage( m_image1, 1 );
m_mt.addImage( m_image2, 1 );
m_mt.addImage( m_image3, 1 );
// start applet'en i egen tråd
thread = new Thread(this);
thread.start();
}
public void paint( Graphics g )
{
// hvis alle images er loaded, så vis det første image
if ( m_loaded )
{
g.drawImage( m_image0, 0, 0, this );
}
else // ellers udskriv custom message
{
g.setColor( Color.white );
g.fillRect( 0, 0, this.size().width, this.size().height );
g.setColor( Color.black );
g.setFont( new Font( "Arial", Font.BOLD, 14 ) );
g.drawString( m_message, 10, 20);
}
}
public void run()
{
try
{
// kald paint() funktionen
paint( this.getGraphics() );
// mens alle images endnu ikke er loadet, ændres custom message
// og tråden venter 500ms
while( m_mt.statusAll( true ) != MediaTracker.COMPLETE )
{
m_message += ".";
paint( this.getGraphics() );
thread.sleep( 500 );
}
}
catch (InterruptedException e) { }
finally
{
// set load flag til true og redraw applet'en
m_loaded = true;
paint(this.getGraphics());
}
}
}
Jeg håber at ovenstående kan inspirere til lidt udbygning af måske allerede eksisterende applet's, men samtidig øge lysten til at udforske MediaTrackeren, som er rimelig central, når der skal loades grafik fra en Java applet.