I’m trying to make my own progress bar, on my splash screen. Creating my splash screen was easy:
java -splash:EaseMailMain.jpg Main.class
(From Eclipse)
The first line of my main method calls this:
new Thread(new Splash()).start();
And this is the splash class:
public class Splash implements Runnable {
public volatile static int percent = 0;
@Override
public void run() {
System.out.println("Start");
final SplashScreen splash = SplashScreen.getSplashScreen();
if (splash == null) {
System.out.println("SplashScreen.getSplashScreen() returned null");
return;
}
Graphics2D g = splash.createGraphics();
if (g == null) {
System.out.println("g is null");
return;
}
int height = splash.getSize().height;
int width = splash.getSize().width;
//g.drawOval(0, 0, 100, 100);
g.setColor(Color.white);
g.drawRect(0, height-50, width, 50);
g.setColor(Color.BLACK);
while(percent <= 100) {
System.out.println((width*percent)/100);
g.drawRect(0, height-50, (int)((width*percent)/100), 50);
percent += 1;
try {
Thread.sleep(50);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
I don’t get any errors, but I do get a small box underneath it:

If I change the drawRects to (0, 0, width, height) it makes no difference.
I’ve tried invoking on the swing EDT with:
SwingUtilities.invokeAndWait((new Splash()));
But nothing happens.
Can anyone see the problem? Or know how to fix it?
You should use
SwingUtilities.invokeLaterorSwingUtilities.invokeAndWaitwhen updating the GUI from a different thread.Please see the Chapter Concurrency in Swing which explains the reasons behind this.
The SplashScreen Example from the Tutorial does the
Thread.sleepinside the Swing thread. This is fine, too if you do not need any other GUI refresh while the SplashScreen is showing. Your loading code however should happen in a different thread.I would recommend adding a
setPercentsetter to your class which creates aRunnableto update the GUI viaSwingUtilities.invokeLater. That way you do not even need to poll thepercentvariable and theSwingThreadis free to render other UI stuff, too.