首页 > 解决方案 > Javafx Stage 在显示元素前几秒钟是空白的

问题描述

我正在尝试使用 JavaFX 创建游戏。我创建了 2 个阶段,一个用于启动画面,第二个用于实际游戏本身。这是我的第一个 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);
    
    
}

}

标签: eclipsejavafx

解决方案


推荐阅读