单击按钮时如何重新启动JavaFX应用程序 [英] How to restart a JavaFX application when a button is clicked

查看:273
本文介绍了单击按钮时如何重新启动JavaFX应用程序的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在这里几乎每一篇文章都谈到了这个问题,但大多数都没有解释要做什么。
问题:

I went through almost every post here regarding the matter but most of them doesn't explain what to do properly. To the question:

我创建了一个javaFX应用程序,一个骰子游戏,一个人类玩家与计算机,但在玩游戏的任何时候人类玩家应该能够点击新游戏按钮,它应该做的是从头开始重启游戏。

I created a javaFX application, a dice game, human player vs. computer, but during any time while playing the game human player should be able to click button "new game" and what it should do is to restart the game from beginning.

我尝试重新启动舞台但是在javafx中我们无法再调用启动方法两次。

I tried relaunching the stage again but in javafx we cannot call the launch method twice.

1)有没有办法可以实现这一点而无需重新启动整个应用程序?

2)如果不能如何完全重启应用程序点击按钮?

主要类

public class Main {
public static void main(String[] args) {
    GameUI gameUI = new GameUI();

    gameUI.launch(GameUI.class, args);

}   

GameUI
(我删除了很多代码我认为足以给出一个想法的代码包括在内。抱歉,如果它太长了。)

GameUI (i removed many codes from this class to make it short. codes that i think enough to give an idea is included. sorry if it is too long.)

public class GameUI extends Application  {

 //all btn and label declarations 
//creating instances for necessary classes

private Scene scene;

@Override
public void start(Stage primaryStage) throws Exception {

    //Displaying Dice for Player and Computer
    setLabelsPlyr(diesP);
    setLabels(diesC);

    btnThrow = new Button("Throw");
    btnThrow.setPrefSize(70, 40);

    //Throw action is performed
    btnThrow.setOnAction(e -> {

    //setting and displaying dies
      DieClass[] com = getNewDiceArrC();  
      lblDiceOneC.setGraphic(new ImageView(diesC[0].getDieImageC()));
      //so on.....

      DieClass[] playerAr = getNewDiceArrP();
      lblDiceOnePlyr.setGraphic(new ImageView(diesP[0].getDieImageP()));
      //so on...
    });

    btnNewGame = new Button("New Game");
    btnNewGame.setOnAction(e -> {

           **//WHAT TO DO HERE?????**

    });

    //setting layouts


    GridPane gridPane = new GridPane();
    gridPane.add(lblComputer, 0, 0);
    //so on.....

    Scene scene = new Scene(gridPane, 1100, 400);
    primaryStage.setScene(scene);
    primaryStage.setTitle("dice Game");
    primaryStage.show();

}

//some other methods
public void setLabels(DieClass[] dies) {
    for (int i=0; i < dies.length; i++) {
        lblDiceOneC = new Label();
        lblDiceOneC.setGraphic(new ImageView(dies[0].getDieImageC()));
        ++i;
       //so on.....

        break;
    }
}

public void setLabelsPlyr(DieClass[] dies){
    for (int i=0; i<dies.length; i++) {
        lblDiceOnePlyr = new Label();
        lblDiceOnePlyr.setGraphic(new ImageView(dies[0].getDieImageP()));
        ++i;
        lblDiceTwoPlyr = new Label();
        //so on......
        break;
    }
}

ps我是JavaFX的新手,有些新手java编程。

p.s I am very new to JavaFX and somewhat new to java programming.

推荐答案

您已经注意到您无法再次启动启动过程。因此,最好的选择是重写应用程序类并将初始化逻辑移动到新方法:

You already noticed that you cannot do the launching process again. Therefore your best option is to rewrite the application class and move the initialisation logic to a new method:

void cleanup() {
    // stop animations reset model ect.
}

void startGame(Stage stage) {
    // initialisation from start method goes here

    btnNewGame.setOnAction(e -> {
       restart(stage);
    });

    stage.show();
}

void restart(Stage stage) {
    cleanup();
    startGame(stage);
}

@Override
public void start(Stage primaryStage) {
    startGame(primaryStage);
}



注释




  • 根据更改的场景部分,可能足以更改某些节点的状态(比创建新场景更有效)。 (只需看看你在游戏中所做的更改并自行决定)

  • launch() static 方法,因此您不应自行创建应用程序类的实例。使用 Application.launch(GameUI.class,args); 代替让该方法处理 GameUI 实例的创建。

  • 将UI创建移动到与应用程序类不同的类可能是更好的设计。这样就可以更容易地重用代码,因为它不需要创建 Application 的子类实例。

  • Notes

    • Depending on the parts of the scene changed, it may be enough to change the state of some of the nodes (more efficient than creating a new scene). (Just take a look at the changes you made during the game and decide for yourself)
    • launch() is a static method and you should not create a instance of your application class yourself for that reason. Use Application.launch(GameUI.class, args); instead and let the method handle the creation of the GameUI instance.
    • It may be a better design to move the UI creation to a class different to the application class. This way reuse of the code is easier, since it does not require the creation of a instance of a subclass of Application.
    • 这篇关于单击按钮时如何重新启动JavaFX应用程序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆