Eclipse javafxstage在显示元素之前几秒钟是空白的

Eclipse javafxstage在显示元素之前几秒钟是空白的,eclipse,javafx,Eclipse,Javafx,我正在尝试用JavaFX创建一个游戏。我已经创建了两个阶段,一个用于splashscreen,第二个用于实际游戏本身。这是我的第一个JavaFX程序,我是一个学习JavaFX的学生。我遇到的问题是,当我隐藏第一个阶段并显示第二个阶段时,第二个阶段保持空白几秒钟,然后继续显示所有元素。现在,舞台上只有一个gif显示,其中有一些音乐(加载时不会延迟,因为它是一个实例变量)。我不想为我希望放入阶段的每个元素创建许多实例变量。以下是代码,其中仅显示了理解问题所需的代码: import java.awt.

我正在尝试用JavaFX创建一个游戏。我已经创建了两个阶段,一个用于splashscreen,第二个用于实际游戏本身。这是我的第一个JavaFX程序,我是一个学习JavaFX的学生。我遇到的问题是,当我隐藏第一个阶段并显示第二个阶段时,第二个阶段保持空白几秒钟,然后继续显示所有元素。现在,舞台上只有一个gif显示,其中有一些音乐(加载时不会延迟,因为它是一个实例变量)。我不想为我希望放入阶段的每个元素创建许多实例变量。以下是代码,其中仅显示了理解问题所需的代码:

import java.awt.Dimension;
import java.awt.Toolkit;
import java.io.File;

import javafx.animation.Animation;
import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.application.Platform;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.canvas.Canvas;
import javafx.scene.control.CheckBox;
import javafx.scene.control.Slider;
import javafx.scene.control.TextField;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;
import javafx.scene.input.MouseEvent;
import javafx.scene.media.Media;
import javafx.scene.media.MediaPlayer;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.scene.text.Font;
import javafx.scene.text.Text;
import javafx.stage.Stage;
import javafx.util.Duration;


public class Main extends Application {
    
    Dimension window = Toolkit.getDefaultToolkit().getScreenSize();
    
    private double screenWidth = window.getWidth();
    private double screenHeight = window.getHeight();
    
    private boolean fullscreen = false;
    private boolean music = false;
    private double value = 0;
    private Group root, root2;
    private Image start;
    private Image startHover;
    private ImageView startViewer;
    private Stage stage;
    private boolean firstWindowExists = true;
    private CheckBox full;
    private CheckBox sound;
    private Slider slider;
    
    
    private Image BG;
    private ImageView BGView;

private String path = "bin/Audio/8_bit_march.mp3";
private Media media;
private MediaPlayer player;

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

private void run() {
    Image title = new Image("Title.png", 300, 0, true, true);
    ImageView titleView= new ImageView();
    titleView.setX(200);
    titleView.setY(10);
    titleView.setImage(title);
    add(titleView);

    start = new Image("Start1.png", 200, 0, true, true);
    startHover = new Image("Start_Hover1.png", 200, 0, true, true);
    startViewer= new ImageView();
    startViewer.setX(250);
    startViewer.setY(300);
    startViewer.setOnMouseEntered(mouseEnter);
    startViewer.setOnMouseExited(mouseExit);
    startViewer.setOnMouseReleased(mouseReleased);
    startViewer.setImage(start);
    add(startViewer);       
    
    if (!firstWindowExists) {//this code works
        Image title2 = new Image("BG.gif", (screenWidth/1.25) + 4, (screenHeight/1.25)+4, false, true);
        ImageView titleView2= new ImageView();
        titleView2.setX(-2);
        titleView2.setY(-2);
        titleView2.setImage(title2);
        add2(titleView2);
    }
    
}

EventHandler<ActionEvent> event = new EventHandler<ActionEvent>() { 
      
    public void handle(ActionEvent e) 
    { 
        if (sound.isSelected()) { // the checkbox is checked to be enabled
            slider.setVisible(true);
        }
        else {
            slider.setVisible(false);
        }
    }

}; 

EventHandler<MouseEvent> mouseEnter = new EventHandler<MouseEvent>() {
    public void handle(MouseEvent event) { // irrelevant for this problem
        startViewer.setImage(startHover);
    }
};

EventHandler<MouseEvent> mouseExit = new EventHandler<MouseEvent>() {
    public void handle(MouseEvent event) {
        startViewer.setImage(start);
    }
};

EventHandler<MouseEvent> mouseReleased = new EventHandler<MouseEvent>() {
    public void handle(MouseEvent event) {          
        stage.hide(); //hide first window
        
        firstWindowExists = false;

        
        Stage stage2 = new Stage(); // creating a new stage 
        root2 = new Group(); //creating new group
        Scene scene2 = new Scene(root2, Color.WHITE);// creating a scene and adding the newly created Group
        Canvas canvas2 = new Canvas(screenWidth/1.25, screenHeight/1.25); // creating a canvas for the screen
        root2.getChildren().add(canvas2); // adding canvas to the group (window)
        
        stage2.setTitle("Game"); // setting the title of the window
        stage2.setScene(scene2); // Adds scene to the stage
        stage2.setFullScreen(fullscreen); 
        
        stage2.show(); //after showing the screen here, it stays blank and then adds the title2 gif
        stage2.centerOnScreen();
        
        if (music) { //plays music 
            player.play();
            player.setVolume(value);
            player.setCycleCount(MediaPlayer.INDEFINITE);
        }
        run(); // runs the method with heavy lifting stuff
    }
};

Timeline timeline = new Timeline(new KeyFrame(Duration.seconds(1), event -> {
    
}));

private void add(Node node) {
    if (firstWindowExists) {
        root.getChildren().add(node);
    }
}

private void add2(Node node) {
    root2.getChildren().add(node);
}

@Override
public void start(Stage stage) throws Exception { // main method which creates the first window 
    this.stage = stage;
    stage.setTitle("Test GUI");
    
    root = new Group();
    Scene scene = new Scene(root, Color.DARKGRAY);
    Canvas canvas = new Canvas(700, 350);
    root.getChildren().add(canvas);

    stage.setScene(scene);
    stage.setResizable(false);
    stage.show();
    stage.centerOnScreen();
    
    root.requestFocus();
    run();
    
    media = new Media(new File(path).toURI().toString());
    player = new MediaPlayer(media);
    
    
}

}
导入java.awt.Dimension;
导入java.awt.Toolkit;
导入java.io.File;
导入javafx.animation.animation;
导入javafx.animation.KeyFrame;
导入javafx.animation.Timeline;
导入javafx.application.application;
导入javafx.application.Platform;
导入javafx.event.ActionEvent;
导入javafx.event.EventHandler;
导入javafx.scene.Group;
导入javafx.scene.Node;
导入javafx.scene.scene;
导入javafx.scene.canvas.canvas;
导入javafx.scene.control.CheckBox;
导入javafx.scene.control.Slider;
导入javafx.scene.control.TextField;
导入javafx.scene.image.image;
导入javafx.scene.image.ImageView;
导入javafx.scene.input.KeyCode;
导入javafx.scene.input.KeyEvent;
导入javafx.scene.input.MouseEvent;
导入javafx.scene.media.media;
导入javafx.scene.media.MediaPlayer;
导入javafx.scene.paint.Color;
导入javafx.scene.shape.Rectangle;
导入javafx.scene.text.Font;
导入javafx.scene.text.text;
导入javafx.stage.stage;
导入javafx.util.Duration;
公共类主扩展应用程序{
维度窗口=Toolkit.getDefaultToolkit().getScreenSize();
private double screenWidth=window.getWidth();
私有双屏幕高度=window.getHeight();
私有布尔全屏=假;
私有布尔音乐=假;
私有双值=0;
私有组根,root2;
私人形象启动;
私人影星;
私人ImageView startViewer;
私人舞台;
私有布尔值firstWindowExists=true;
私人复选框已满;
私人录音;
专用滑块;
私有图像背景;
私有图像视图;
私有字符串路径=“bin/Audio/8\u bit\u march.mp3”;
私人媒体;
私人媒体播放器;
公共静态void main(字符串[]args){
发射();
}
私家车{
图像标题=新图像(“title.png”,300,0,true,true);
ImageView标题视图=新建ImageView();
titleView.setX(200);
titleView.setY(10);
titleView.setImage(标题);
添加(标题视图);
开始=新图像(“Start1.png”,200,0,真,真);
startHover=新图像(“Start_Hover1.png”,200,0,true,true);
startViewer=新图像视图();
startViewer.setX(250);
startViewer.setY(300);
StartView.setOnMouseEntered(鼠标输入);
StartView.SetOnMouseExit(鼠标退出);
StartView.setOnMouseReleased(鼠标释放);
startViewer.setImage(开始);
添加(startViewer);
如果(!firstWindowExists){//此代码有效
图像标题2=新图像(“BG.gif”,(屏幕宽度/1.25)+4,(屏幕高度/1.25)+4,假,真);
ImageView标题视图2=新的ImageView();
titleView2.setX(-2);
titleView2.setY(-2);
titleView2.setImage(title2);
增补2(标题2);
}
}
EventHandler事件=新的EventHandler(){
公共无效句柄(ActionEvent e)
{ 
如果(sound.isSelected()){//,则选中该复选框以启用
slider.setVisible(true);
}
否则{
slider.setVisible(假);
}
}
}; 
EventHandler mouseEnter=neweventhandler(){
public void句柄(MouseEvent事件){//与此问题无关
StartView.setImage(StartOver);
}
};
EventHandler mouseExit=新的EventHandler(){
公共无效句柄(MouseeEvent事件){
startViewer.setImage(开始);
}
};
EventHandler mousererelease=neweventhandler(){
公共无效句柄(MouseEvent事件){
stage.hide();//隐藏第一个窗口
firstWindowExists=false;
Stage stage2=new Stage();//创建一个新的Stage
root2=新组();//创建新组
scene2=新场景(root2,Color.WHITE);//创建场景并添加新创建的组
Canvas canvas2=新画布(screenWidth/1.25,screenHeight/1.25);//为屏幕创建画布
root2.getChildren().add(canvas2);//将画布添加到组(窗口)
stage2.setTitle(“游戏”);//设置窗口的标题
stage2.setScene(scene2);//将场景添加到舞台
阶段2.设置全屏(全屏);
stage2.show();//在此处显示屏幕后,屏幕保持空白,然后添加标题2 gif
stage2.centerOnScreen();
如果(音乐){//播放音乐
player.play();
player.setVolume(值);
player.setCycleCount(MediaPlayer.unfinite);
}
run();//使用重载对象运行该方法
}
};
时间线=新时间线(新关键帧)(持续时间。秒(1),事件->{
}));
专用void添加(节点){
如果(第一个窗口存在){
root.getChildren().add(节点);
}
}
私有void add2(节点){
root2.getChildren().add(节点);
}
@凌驾
public void start(Stage)抛出异常{//main方法,该方法创建第一个窗口
这个阶段=阶段;
stage.setTitle(“测试GUI”);
root=新组();
场景=新场景(根,Color.DARKGRAY);
画布=新画布(700350);
root.getChildren().add(画布);
舞台场景;
阶段。可设置大小(假);
雄鹿