单击按钮时如何重新启动JavaFX应用程序

时间:2016-01-14 11:06:50

标签: java javafx restart application-restart

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

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

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

1)有没有办法在不重新启动整个应用程序的情况下实现这一点?

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

主要课程

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

    gameUI.launch(GameUI.class, args);

}   

GameUI (我删除了这个类中的许多代码以使其变短。我认为足以给出一个想法的代码。抱歉,如果它太长了。)

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;
    }
}

p.s我是JavaFX的新手,对Java编程有些新意。

1 个答案:

答案 0 :(得分:2)

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

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子类的实例。