2015-08-07 43 views
8

Utworzono moduł wstępnego ładowania (oparty na poniższym samouczku), który powinien wyświetlać ekran powitalny dla głównej aplikacji.Jak utworzyć ekran powitalny jako preloader w samodzielnej aplikacji JavaFX?

9.3.4 Korzystanie preloader do wyświetlania Application inicjalizacji Postęp 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(); 
     } 
    } 

} 

Chciałbym uruchomić preloader za każdym razem uruchomić główne zastosowanie w moim IDE (IntelliJ IDEA).

ja również po zasady pakowania dla obciążenia wstępnego w IntelliJ: https://www.jetbrains.com/idea/help/applications-with-a-preloader-project-organization-and-packaging.html

Kiedy uruchomić główne zastosowanie preloader się nie rozpocznie, więc przypuszczam, że ja czegoś brakuje. Jestem nowy w Preloaders i nie rozumiem, jaki jest mechanizm łączenia głównej aplikacji z preloaderem w samodzielnej aplikacji.

Odpowiedz

7

można uruchomić za pomocą LauncherImpl takiego. . .

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

I klasa MyApplication byłaby podobna. . .

public class MyApplication extends Application { 

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

właściwość systemu javafx.preloader = classname wydaje się działać zbyt – pranahata

+0

Dla Java 9, gdzie 'LauncherImpl' nie jest już publicznie dostępny klasa, użyj' javafx.preloader = classname' własności do zrozumienia przez pranahata. Patrz: [Java 9 JavaFX Preloader] (https://stackoverflow.com/questions/47533370/java-9-javafx-preloader/47540060#47540060). – jewelsea

2

IDE nie są jeszcze świetne w dodawaniu preloaderów. Spójrz na Manifest w pliku jar Twojego programu i upewnić się, że linia jest obecna:

JavaFX-Preloader-Class: SplashScreenLoader 
0

Może być za późno, może to również pomóc komuś. Dla mnie, użyłem usługi i zadania JavaFX do utworzenia ekranu powitalnego jako Preloader w samodzielnej aplikacji JavaFX. To, ponieważ contexte mojego projektu.

Stworzy AnchorPane a Pane postęp

@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(); 
//..... 

} 

Tworzenie usługę ekran powitalny jak to:

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; 
      } 
     }; 
    } 
}; 

serwisu Start i pokazać/ukryć progressPane na initRoot podczas ładowania ekran główny:

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(); 
     } 
    } 

Aby pokazać/ukryć postęp ...

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