Java FX splash screen

0

Chciałbym utworzyć w swojej aplikacji coś co będzie splash screenem. Wyszukałem kilka artykułów, ale niestety nie potrafię sobie z tym poradzić.
Chciałbym w najprostszy sposób wyświetlić zwykły obrazek przed odpaleniem okna głównego. Robiłem to na zasadzie wstawienia w okno obrazka. Następnie wyświetlenie okna, później sleep(3000), kolejno wyświetlenie okna głównego i zamknięcie okna ze splashscreenem. Jednak dało to taki efekt że przez pierwsze 3 sekundy widzę tylko w pasku że okno ze splashscreenem się pojawiło (okna nie widzę), po 3 sekundach odpala się okno główne, a to ze splashem ginie.

1

A w którym wątku odpaliłeś tego sleepa? Jeśli w wątku JavyFX to nie dziw się, że całe UI przysnęło.

0

Hmm tak właśnie w wątku Javy. Ogólnie nie programuję w Javie, a jeśli chodzi o JavaFX to jest mój pierwszy program. Mógłbyś jakoś schematycznie podać jak najłatwiej to zrobić?

0

A może wystarczy uruchomienie z opcją -splash?

0

Stworzyłem projekt i do tego zaznaczyłem aby stworzyło coś takiego jak preloader. Jakoś działa ale nie wiem czy jest to poprawnie zrobione.

package javafxapplication6.preloader;

import static java.lang.Thread.sleep;
import java.util.logging.Level;
import java.util.logging.Logger;
import javafx.application.Preloader;
import javafx.application.Preloader.ProgressNotification;
import javafx.application.Preloader.StateChangeNotification;
import javafx.scene.Scene;
import javafx.scene.control.ProgressBar;
import javafx.scene.image.ImageView;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
import javafx.stage.StageStyle;

/**
 * Simple Preloader Using the ProgressBar Control
 *
 * @author Łukasz
 */
public class JavaFXApplication6_Preloader extends Preloader {
    
    ProgressBar bar;
    Stage stage;
    
    private Scene createPreloaderScene() {
        StackPane root = new StackPane();
        ImageView img = new ImageView("https://www.google.pl/logos/doodles/2014/world-cup-2014-12-5204175918989312.2-hp.gif");
        root.getChildren().add(img);
        bar = new ProgressBar();
        BorderPane p = new BorderPane();
        p.setCenter(bar);
        return new Scene(root, 500, 150);        
    }
    
    @Override
    public void start(Stage stage) throws Exception {
        this.stage = stage;
        stage.initStyle(StageStyle.TRANSPARENT);
        stage.setScene(createPreloaderScene());        
        stage.show();

    }
    
    @Override
    public void handleStateChangeNotification(StateChangeNotification scn) {
        if (scn.getType() == StateChangeNotification.Type.BEFORE_START) {
            stage.hide();
        }
    }
    
    @Override
    public void handleProgressNotification(ProgressNotification pn) {
        try {
            sleep(2000);//tutaj wrzuciłem sleep
        } catch (InterruptedException ex) {
            Logger.getLogger(JavaFXApplication6_Preloader.class.getName()).log(Level.SEVERE, null, ex);
        }
        bar.setProgress(pn.getProgress());
    }    
    
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1