2013-06-01 5 views
0

Мне интересно, как я могу отображать сообщение «Загрузка» во время запуска JavaFX. Я заметил, например, что, когда я запускаю SceneBuilder, мне нужно подождать ~ 5 секунд, прежде чем приложение появится перед пользователем. Могу ли я, например, отобразить некоторое сообщение во время запуска JVM?Экран «Загрузка» во время запуска приложения

ОБНОВЛЕНИЕ

Я испытал этот код:

public class test extends Application 
{ 

    private Pane splashLayout; 
    private ProgressBar loadProgress; 
    private Label progressText; 
    private WebView webView; 
    private Stage mainStage; 
    private static final int SPLASH_WIDTH = 676; 
    private static final int SPLASH_HEIGHT = 227; 

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

    @Override 
    public void init() 
    { 
     ImageView splash = new ImageView(new Image("http://fxexperience.com/wp-content/uploads/2010/06/logo.png")); 
     loadProgress = new ProgressBar(); 
     loadProgress.setPrefWidth(SPLASH_WIDTH - 20); 
     progressText = new Label("Loading System Modules ..."); 
     splashLayout = new VBox(); 
     splashLayout.getChildren().addAll(splash, loadProgress, progressText); 
     progressText.setAlignment(Pos.CENTER); 
     splashLayout.setStyle("-fx-padding: 5; -fx-background-color: cornsilk; -fx-border-width:5; -fx-border-color: linear-gradient(to bottom, chocolate, derive(chocolate, 50%));"); 
     splashLayout.setEffect(new DropShadow()); 
    } 

    @Override 
    public void start(final Stage initStage) throws Exception 
    { 
     showSplash(initStage); 
     showMainStage(); 

     webView.getEngine().documentProperty().addListener(new ChangeListener<Document>() 
     { 
      @Override 
      public void changed(ObservableValue<? extends Document> observableValue, Document document, Document document1) 
      { 
       if (initStage.isShowing()) 
       { 
        loadProgress.progressProperty().unbind(); 
        loadProgress.setProgress(1); 
        progressText.setText("All Modules Are Loaded!"); 
        mainStage.setIconified(false); 
        initStage.toFront(); 
        FadeTransition fadeSplash = new FadeTransition(Duration.seconds(1.2), splashLayout); 
        fadeSplash.setFromValue(1.0); 
        fadeSplash.setToValue(0.0); 
        fadeSplash.setOnFinished(new EventHandler<ActionEvent>() 
        { 
         @Override 
         public void handle(ActionEvent actionEvent) 
         { 
          initStage.hide(); 
         } 
        }); 
        fadeSplash.play(); 
       } 
      } 
     }); 
    } 

    private void showMainStage() 
    { 
     mainStage = new Stage(StageStyle.DECORATED); 
     mainStage.setTitle("FX Experience"); 
     mainStage.setIconified(true); 

// create a WebView. 
     webView = new WebView(); 
     webView.getEngine().load("http://fxexperience.com/"); 
     loadProgress.progressProperty().bind(webView.getEngine().getLoadWorker().workDoneProperty().divide(100)); 

// layout the scene. 
     Scene scene = new Scene(webView, 1000, 600); 
     webView.prefWidthProperty().bind(scene.widthProperty()); 
     webView.prefHeightProperty().bind(scene.heightProperty()); 
     mainStage.setScene(scene); 
     mainStage.show(); 
    } 

    private void showSplash(Stage initStage) 
    { 
     Scene splashScene = new Scene(splashLayout); 
     initStage.initStyle(StageStyle.UNDECORATED); 
     final Rectangle2D bounds = Screen.getPrimary().getBounds(); 
     initStage.setScene(splashScene); 
     initStage.setX(bounds.getMinX() + bounds.getWidth()/2 - SPLASH_WIDTH/2); 
     initStage.setY(bounds.getMinY() + bounds.getHeight()/2 - SPLASH_HEIGHT/2); 
     initStage.show(); 
    } 
} 

я заметил, что изображение всплеск начинается с основной стадии одновременности, но основной этап сводится к минимуму. Могу ли я заморозить внешний вид основной сцены, пока заставка не будет заполнена загрузкой. Я хочу сделать некоторые внутренние проверки, прежде чем отобразить основной этап.

+0

@jewelsea Я обновил свой пост. –

ответ

Смежные вопросы