2015-08-07 16 views
8

Ho creato un Preloader (basato sul seguente tutorial) che dovrebbe visualizzare una schermata iniziale per l'applicazione principale.Come creare una schermata iniziale come Preloader nell'applicazione autonoma JavaFX?

9.3.4 Utilizzo di un Preloader per visualizzare l'applicazione di inizializzazione Progress http://docs.oracle.com/javafx/2/deployment/preloaders.htm

public class SplashScreenLoader extends Preloader { 

    private Stage splashScreen; 

    @Override 
    public void start(Stage stage) throws Exception { 
     splashScreen = stage; 
     splashScreen.setScene(createScene()); 
     splashScreen.show(); 
    } 

    public Scene createScene() { 
     StackPane root = new StackPane(); 
     Scene scene = new Scene(root, 300, 200); 
     return scene; 
    } 

    @Override 
    public void handleApplicationNotification(PreloaderNotification notification) { 
     if (notification instanceof StateChangeNotification) { 
      splashScreen.hide(); 
     } 
    } 

} 

mi piacerebbe correre preloader ogni volta che faccio funzionare l'applicazione principale nel mio IDE (IntelliJ IDEA).

Ho anche seguito le regole di imballaggio per preloaders in IntelliJ: https://www.jetbrains.com/idea/help/applications-with-a-preloader-project-organization-and-packaging.html

Quando eseguo l'applicazione principale del preloader non si avvia, quindi suppongo che mi manca qualcosa. Sono nuovo di Preloader e non capisco quale sia il meccanismo per connettere l'app principale con il preloader in un'applicazione standalone.

risposta

7

È possibile eseguire usando LauncherImpl come questo. . .

public class Main { 
    public static void main(String[] args) { 
     LauncherImpl.launchApplication(MyApplication.class, SplashScreenLoader.class, args); 
    } 
} 

E la classe MyApplication sarebbe come questo. . .

public class MyApplication extends Application { 

    @Override 
    public void start(Stage primaryStage) { 
     .... 
     primaryStage.show(); 
    } 
    public static void main(String[] args) { 
     launch(args); 
    } 
} 
+0

sistema di proprietà javafx.preloader = classname sembra funzionare troppo – pranahata

+0

Per Java 9, dove 'LauncherImpl' non è più una classe a disposizione del pubblico, utilizzare il javafx.preloader = classname' proprietà' accennato da pranahata. Vedi: [Java 9 JavaFX Preloader] (https://stackoverflow.com/questions/47533370/java-9-javafx-preloader/47540060#47540060). – jewelsea

2

Gli IDE non sono ancora ottimi per aggiungere preloader. Date un'occhiata al manifesto nel file jar del tuo programma e assicurarsi che questa linea è presente:

JavaFX-Preloader-Class: SplashScreenLoader 
0

Potrebbe essere troppo tardi, questo può anche aiutare qualcuno. Per me, ho utilizzato il servizio JavaFX e l'attività per creare una schermata iniziale come Preloader nell'applicazione autonoma JavaFX. Questo, perché il contesto del mio progetto.

Creare l'AnchorPane e il riquadro di avanzamento

@FXML 
private AnchorPane anchorPane; 
private MaskerPane progressPane; 


public static void main(String[] args) { 
    launch(args); 
} 

    @Override 
public void init() throws Exception { 
    progressPane = new MaskerPane(); 
    progressPane.setText(bundle.getString("root.pleaseWait")); 
    progressPane.setVisible(false); 
    AnchorPane.setLeftAnchor(progressPane, 0.0); 
    AnchorPane.setTopAnchor(progressPane, 0.0); 
    AnchorPane.setRightAnchor(progressPane, 0.0); 
    AnchorPane.setBottomAnchor(progressPane, 0.0); 
    anchorPane.getChildren().add(progressPane); 
} 

@Override 
public void start(Stage initStage) { 
    //..... 
    initRoot(); 
//..... 

} 

Creare il servizio schermata iniziale come questo:

private final Service<Void> splashService = new Service<Void>() { 
    @Override 
    protected Task<Void> createTask() { 
     return new Task<Void>() { 
      @Override 
      public Void call() throws Exception { 
       //main code, the code who take time 
       //or 
       //Thread.sleep(10000); 
       return null; 
      } 
     }; 
    } 
}; 

servizio Start e mostra/nascondi la progressPane su initRoot quando carica la schermata principale:

public void initRoot() { 
    try { 
     //.... 

     splashService.restart(); 
     //On succeeded, do this 
     splashService.setOnRunning(new EventHandler<WorkerStateEvent>() { 
      @Override 
      public void handle(WorkerStateEvent event) { 
       //Show mask on succeed 
       showMask(Boolean.TRUE); 
      } 
     }); 
     splashService.setOnSucceeded(new EventHandler<WorkerStateEvent>() { 
      @Override 
      public void handle(WorkerStateEvent event) { 
       splashService.cancel(); 
       //Hide mask on succeed 
       showMask(Boolean.FALSE); 
      } 
      });  
      //..... 
      primaryStage.show(); 
     } catch (IOException ex) { 
      ex.printStackTrace(); 
     } 
    } 

Per mostrare/nascondere l'avanzamento ...

showMask(boolean value){ 
     progressPane.setVisible(value); 
}; 
Problemi correlati