Splash Screen Problem

shocking

Mitglied
Hi Leute,

ich könnte mal dringend Hilfe bei einem Problem bezüglich SplashScreen in Java brauchen.
Ich habe eine Anwendung, die aufgrund der durchzuführenden Schritte etwas länger zum Starten braucht. Daher möchte ich einen SplashScreen dazu packen, der mit der Anwendung gestartet wird und solange angeziegt wird, wie im Hintergrund die durchzuführenden Schritte durchlaufen werden.
Jetzt habe ich im Grunde genommen 2 Probleme:

1. Wie kann ich die darzustellenden Informationen über die einzelnen Schritte (z.B. Schritt 1 fertig, Schritt 2 fertig etc.) an meinen SplashScreen weitergeben,. so dass dieser entsprechend aktualisiert wird?
2. Wie kann ich einen realistischen aber flüssigen Verlauf für die ProgressBar des SplashScreens hinkriegen? Bei meinem Programm kann es sein, dass die Schritte unterschiedlich lange brauchen. Bsp: Schritt 1 braucht 20 Sekunden, Schritt 2 2 Sekunden. Wenn ich die Aktualisierung der ProgressBar nach dem ersten Schritt machen, passiert erst mal lange nichts und dann ein riesiger Schritt..

Hier mal meine Sourcen:
Code:
    public static void main(String[] args) throws IOException {
       Main main = new Main();
       service.execute(main);
}

Code:
    public class Main extends StartThread {

    /**
     * Start-Methode der Applikation.
     * 
     * @param args
     * @throws IOException
     */
    public static void main(String[] args) throws IOException {
        Main main = new Main();
        service.execute(main);
    }

    /**
     * {@inheritDoc}
     */
    protected void starteApplikation() {
        doSchritt_1();
        LOG.info("Schritt 1 erledigt..:");
        doSchritt_2();
        LOG.info("Schritt 2 erledigt..:");
        doSchritt_3();
        LOG.info("Schritt 3 erledigt..:");
    }
}

Code:
public abstract class StartThread extends Thread {

    /** Instanz eines ExecutorServices, welcher den ChildThread startet. */
    protected static ExecutorService service = Executors.newCachedThreadPool();
    /** Instant des Loggers. */
    private static final Log LOG = LogFactory.getLog(StartThread.class);
    private SplashScreenThread childThread;
    private boolean isWorking;

    /**
     * {@inheritDoc}
     */
    @Override
    public void run() {

        LOG.info("StartThread.run wurde gestartet... ");

        synchronized (this) {

            isWorking = true;
            childThread = new SplashScreenThread(this);
            service.execute(childThread);

            starteApplikation();
            isWorking = false;
        }

        LOG.info("StartThread.run wurde beendet... ");
    }

    /**
     * Startet die Applikation.
     */
    protected abstract void starteApplikation();

    public boolean isWorking() {
        return this.isWorking;
    }

Code:
public class SplashScreenThread implements Runnable {

    private StartThread masterThread;
    private SplashScreenMain splashScreenMain;

    public SplashScreenThread(StartThread masterThread) {
        this.masterThread = masterThread;
    }

    @Override
    public void run() {
        System.out.println("ChildThread start");

        // Hier wird mein JWindow mit den entsprechenden Initialisierungen 
        // erstellt (also der SplashScreen)
        splashScreenMain = new SplashScreenMain();

        while (masterThread.isWorking()) {

        }
        splashScreenMain.dispose();

        System.out.println("ChildThread ende");

    }
}

Hat vielleicht jemand von Euch nen Tip, wie und wann ich die Werte des SplashScreens aktualisieren kann? Wenn ich es in der startApplikation-Methode mache, bekomme ich immer NullPointer.

Vielen Dank Gruß
shocking
 
Falls es jemanden interessiert:

Meine run-Methode des SplashScreenThreads ruft nun ein Utility mit statischen Methoden für das Update auf. Das funktioniert prima...

Code:
 /**
     * {@inheritDoc}
     */
    @Override
    public void run() {

        // erstellen des SplashScreens
        this.splashScreen = new SplashScreen();

        // in einer Endlosschleife werden hier nun die Werte aus dem Utility
        // abgefragt, um diese im SplachScreen zu setzen
        while (true) {

            // wenn das Abbuchkriterium erfuellt ist (also der Text dem Beenden
            // entspricht)
            if (this.beenden) {
                // soll der SplashScreen entfernt werden
                this.splashScreen.dispose();
                LOG.info("Dispose Splash-Screen");
                break;
            } else {
                // ansonsten erfolgt das Update der Werte
                this.splashScreen.setProgress(SplashUpdateUtility.getPercentage());
                this.splashScreen.setInfoText(SplashUpdateUtility.getText());
            }

            // um die Abfragen ein wenig zu verzoegern (es werden nicht so viele
            // neue Werte gesetzt wie hier Durchlaeufe gestartet werden, so dass
            // dies zu einem Performance Problem werden koennte), wird hier der
            // Thread ein wenig schlafen gelegt...
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                LOG.info(e);
            }
        }

    }
 
Zurück