2016-02-27 2 views
2

Вот мой код, я пытаюсь загрузить изображение с заставкой с прозрачным фоном перед началом моей основной стадии. Они приходят почти в одно и то же время, но большая проблема заключается в том, что я получаю серый прямоугольник раньше всего: I get a grey rectangle before anything else.Я не могу получить прозрачный этап в JavaFX

Вот код:

public class Menu extends Application { 

    private Pane splashLayout; 
    private Stage mainStage; 
    private ImageView splash; 

    // Creating a static root to pass to ScreenControl 
    private static BorderPane root = new BorderPane(); 

    public void start(Stage splashStage) throws IOException { 

     final Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); 
     this.splash = new ImageView(new Image(getClass().getResource("/splash.png").toString())); 

     splashStage.initStyle(StageStyle.TRANSPARENT);  
     showSplash(splashStage, screenSize); 

     // Constructing our scene using the static root 
     root.setCenter(new ScrollPane); 
     Scene scene = new Scene(root, screenSize.getWidth(), screenSize.getHeight()); 
     showMainStage(scene); 

     if (splashStage.isShowing()) { 
      mainStage.setIconified(false); 
      splashStage.toFront(); 
      FadeTransition fadeSplash = new FadeTransition(Duration.seconds(1.5), splashLayout); 
      fadeSplash.setDelay(Duration.seconds(3.5)); 
      fadeSplash.setFromValue(1.0); 
      fadeSplash.setToValue(0.0); 
      fadeSplash.setOnFinished(new EventHandler<ActionEvent>() { 
       @Override 
       public void handle(ActionEvent actionEvent) { 
        splashStage.hide(); 
       } 
      }); 
      fadeSplash.play(); 
     } 
    } 

    private void showMainStage(Scene scene) { 
     mainStage = new Stage(StageStyle.DECORATED);  
     mainStage.setTitle("book-depot"); 
     mainStage.getIcons().add(new Image(getClass().getResourceAsStream("/icon.png"))); 
     mainStage.setScene(scene); 
     mainStage.show(); 
    } 

    private void showSplash(Stage splashStage, Dimension screenSize) { 
     splashLayout = new StackPane(); 
     splashLayout.setStyle("-fx-background-color: transparent;"); 
     splashLayout.getChildren().add(splash); 
     Scene splashScene = new Scene(splashLayout, 690, 590); 
     splashScene.setFill(Color.TRANSPARENT); 
     splashStage.setScene(splashScene); 
     splashStage.show(); 
    } 

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

} 

я делаю что-то не так, или я действительно не могу получить прозрачный фон?

Это то, на что похоже, когда наступает другая сцена, но я бы хотел, чтобы она работала так же, как до загрузки основной сцены, или, по крайней мере, я хочу удалить серый прямоугольник, который вы можете видеть в другой снимок экрана This is what it looks like when also the other stage loads up

+4

Вы можете превратить это в MCVE, что каждый может начать без проблем? Первое, что приходит на ум, это то, что вы должны установить цвет сцены прозрачным. Но я не могу проверить это, так как ваш код не обладает минимальностью и полнотой. – Roland

+0

Вы правы, мне очень жаль. Я немного упростил код, но в следующий раз я задам вопрос, который я буду иметь в виду с самого начала. – Andrea

ответ

3

Серый фон - ваш «mainStage», так как вы одновременно показываете всплеск и основные сцены. В начале, показывая сцену всплеска вы можете просто INIT (не показывать) основной этап и показать его позже, когда анимация заканчивается:

public class ModifiedMenu extends Application 
{ 

    private Pane splashLayout; 
    private Stage mainStage; 
    private ImageView splash; 

    // Creating a static root to pass to ScreenControl 
    private static BorderPane root = new BorderPane(); 

    public void start(Stage splashStage) throws IOException { 

     final Dimension2D screenSize = Toolkit.getDefaultToolkit().getScreenSize(); 
     this.splash = new ImageView(new Image(getClass().getResource("/splash.png").toString())); 

     splashStage.initStyle(StageStyle.TRANSPARENT);  
     showSplash(splashStage, screenSize); 

     // Constructing our scene using the static root 
     root.setCenter(new ScrollPane()); 
     Scene scene = new Scene(root, screenSize.getWidth(), screenSize.getHeight()); 
     initMainStage(scene); 

     if (splashStage.isShowing()) { 
      splashStage.toFront(); 
      FadeTransition fadeSplash = new FadeTransition(Duration.seconds(1.5), splashLayout); 
      fadeSplash.setDelay(Duration.seconds(3.5)); 
      fadeSplash.setFromValue(1.0); 
      fadeSplash.setToValue(0.0); 
      fadeSplash.setOnFinished(new EventHandler<ActionEvent>() { 
       @Override 
       public void handle(ActionEvent actionEvent) { 
        splashStage.hide(); 
        mainStage.show(); 
       } 
      }); 
      fadeSplash.play(); 
     } 
    } 

    private void initMainStage(Scene scene) { 
     mainStage = new Stage(StageStyle.DECORATED);  
     mainStage.setTitle("book-depot"); 
     mainStage.getIcons().add(new Image(getClass().getResourceAsStream("/icon.png"))); 
     mainStage.setScene(scene); 
    } 

    private void showSplash(Stage splashStage, Dimension2D screenSize) { 
     splashLayout = new StackPane(); 
     splashLayout.setStyle("-fx-background-color: transparent;"); 
     splashLayout.getChildren().add(splash); 
     Scene splashScene = new Scene(splashLayout, 690, 590); 
     splashScene.setFill(Color.TRANSPARENT); 
     splashStage.setScene(splashScene); 
     splashStage.show(); 
    } 

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

} 
+0

Это сработало. Благодарю. – Andrea

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