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