2015-08-07 13 views
8

Ana uygulama için bir açılış ekranı görüntülemesi gereken bir Ön Yükleyici (aşağıdaki eğiticiye dayanarak) oluşturdum. Uygulama Başlatma İlerleme http://docs.oracle.com/javafx/2/deployment/preloaders.htmJavaFX bağımsız uygulamasında bir ön yükleyici olarak nasıl açılış ekranı oluşturulur?

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

} 
benim IDE içinde ana uygulamayı çalıştırmak her zaman (IntelliJ IDEA) ön yükleyici çalıştırmak istediğiniz

için, Görüntülü Preloader kullanma

9.3.4.

Ben de IntelliJ içinde preloaders için ambalaj kuralları takip: https://www.jetbrains.com/idea/help/applications-with-a-preloader-project-organization-and-packaging.html

Ben önyükleyici başlamaz ana uygulamayı çalıştırmak, bu yüzden ben bir şey eksik varsayalım . Preloaders için yeniyim ve ana uygulamaya preloader ile bağımsız uygulamada bağlanma mekanizmasının ne olduğunu anlamıyorum.

cevap

7

Böyle LauncherImpl kullanarak çalıştırabilirsiniz. . .

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

Ve sınıf MyApplication bu gibi olurdu. . .

public class MyApplication extends Application { 

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

sistem özelliği javafx.preloader = sınıfadı, LauncherImpl' artık kamuya açık sınıftır 'Java 9 için çok – pranahata

+0

çalışmak pranahata tarafından ima' javafx.preloader = classname' özelliğini kullanın görünmektedir. Bakınız: [Java 9 JavaFX Ön Yükleyicisi] (https://stackoverflow.com/questions/47533370/java-9-javafx-preloader/47540060#47540060). – jewelsea

2

IDE'ler henüz ön yükleyicileri eklerken mükemmel değildir. programınızın kavanoz dosyasında Manifest bir göz atın ve bu hat mevcut olduğundan emin olun:

JavaFX-Preloader-Class: SplashScreenLoader 
0

Çok geç olabilir, bu da birilerine yardımcı olabilir. Benim için JavaFX bağımsız uygulamasında bir ön yükleyici olarak bir açılış ekranı oluşturmak için JavaFX hizmetini ve görevini kullandım. Bu, projemin bağlamı çünkü.

oluştur AnchorPane ve ilerleme Bölmesi

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

} 

bu şekilde giriş ekranı hizmeti oluşturun:

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

Başlat servis ve gösteri/ana ekran yüklerken initRoot üzerinde progressPane gizlemek:

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

İlerleme durumunu göstermek/gizlemek için ...

showMask(boolean value){ 
     progressPane.setVisible(value); 
}; 
İlgili konular