# Splashscreen mit Progressbar/Ladebalken



## FreakyM (15. Februar 2012)

Hallo an Alle,

ich versuche verzweifelt eine Implementierung eines Splashscreens mit integriertem Ladebalken zu finden...
Ich habe jetzt, gefühlt, Google leer gesucht aber nichts gefunden was meinen Vorstellungen entspricht  Habe sogar den JDownloader-SourceCode durchgeschaut, jedoch finde ich hier nicht die Stelle, in welcher der Splashscreen implementiert ist (jemand anders vielleicht?)

Ich suche keinen reinen Splashscreen, welcher nur für x Sekunden ein Bild anzeigt, sondern tatsächlich einen mit ProgressBar/ladebalken. Ich sage das dazu, da sich die Leute auf manchen Seiten nicht einig waren wie ein Splashscreen definiert ist, also mit oder ohne Ladebalken.

Gibt es den keinen Splashscreen welchem man sowas wie "Actions" übergeben/adden kann und er dann selbstständig Multithreaded, oder wie auch immer, diese abarbeitet und dementsprechend seine Prozentzahl anpasst?

Oder kennt jemand eine "professionelle" Implementierung eines Splashscreens welche schon sehr viele Möglichkeiten hat?


Dankeschön im Vorraus 

Gruß
Dennis


----------



## Akeshihiro (15. Februar 2012)

Moin ^^

Mal ne doofe Frage. Warum bastelst du dir nicht selber einen? Is nur ein Bild und ein Ladebalken. Das kann man auch mal eben selbst zusammenklimpern ...


----------



## j2se (16. Februar 2012)

Akeshihiro hat gesagt.:


> Moin ^^
> 
> Mal ne doofe Frage. Warum bastelst du dir nicht selber einen? Is nur ein Bild und ein Ladebalken. Das kann man auch mal eben selbst zusammenklimpern ...



z.B. in einem JFrame mit setUndecorated(true) und schon hat man sein Splashscreen.


----------



## Thomas Darimont (17. Februar 2012)

Hallo,

schau mal hier:

```
package de.tutorials.training;

import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.SplashScreen;
import java.util.concurrent.TimeUnit;

import javax.swing.JFrame;

public class SplashScreenExample{

  public static void main(String[] args) {
    new App().launch();
  }
  
  static class App{
    public void launch(){
      startServices();
      startUI();  
    }

    private void startServices() {
      System.out.println("Starting services...");
      
      StartupProgressIndicator startupProgressIndicator = new StartupProgressIndicator(SplashScreen.getSplashScreen());

      int numberOfServices = 10;
      
      for(int i =1 ; i<= numberOfServices; i++){
        sleepRandomly();
        startupProgressIndicator.updateStartupProgress(i / (float)numberOfServices, "Starting Service: " + i);
      }
      
      System.out.println("Started services.");
    }

    private void sleepRandomly() {
      try {
        TimeUnit.MILLISECONDS.sleep((int)(Math.random() * 1000));
      } catch (InterruptedException e) {
        e.printStackTrace();
      }
    }

    private void startUI() {
      System.out.println("Starting ui...");
      EventQueue.invokeLater(new Runnable() {
        @Override
        public void run() {
          new AppFrame().setVisible(true);
          System.out.println("Started ui.");
        }
      });
    }
  }
  
  static class StartupProgressIndicator{
    
    private final SplashScreen splashScreen;
    
    private Graphics2D g;
    
    public StartupProgressIndicator(SplashScreen splashScreen) {
      this.splashScreen = splashScreen;
      setupGraphics();
    }


    private void setupGraphics() {
      this.g = this.splashScreen.createGraphics();
      this.g.setFont(new Font("ARIAL",Font.BOLD,12));
    }


    public void updateStartupProgress(float progress, String progressMessage) {
      Rectangle splashBounds = splashScreen.getBounds();
      int progressBarHeight = g.getFontMetrics().getHeight();
      int progressBarWidth = (int)(splashBounds.width * progress);
      int progressBarStartY = splashBounds.height-progressBarHeight;
      
      g.setColor(Color.WHITE);
      g.fillRect(0, progressBarStartY, splashBounds.width, progressBarHeight);
      
      g.setColor(Color.ORANGE);
      g.fillRect(0, progressBarStartY, progressBarWidth, progressBarHeight);
      
      g.setColor(Color.BLACK);
      g.drawString(progressMessage, 0, splashBounds.height-2);
      this.splashScreen.update();
    }
  }
  
    
  static class AppFrame extends JFrame{
    public AppFrame(){
      super("AppFrame");
      setDefaultCloseOperation(EXIT_ON_CLOSE);
      setSize(640, 480);
    }
  }
}
```

Auführen mit jvm-Parameter -splash:


```
java -splash:res/tutorials_headerlogo_white_bg.png -cp . de.tutorials.training.SplashScreenExample
```

Siehe auch:
http://java.sun.com/developer/technicalArticles/J2SE/Desktop/javase6/splashscreen/


Gruß Tom


----------

