当前位置: 首页 > 面试题库 >

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

姚德容
2023-03-14
问题内容

关于此事,我几乎遍历了每篇文章,但大多数都没有解释如何正确执行。问题:

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

我尝试再次启动该阶段,但是在javafx中,我们不能两次调用launch方法。

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

ps我对JavaFX非常陌生,对Java编程也有些陌生。


问题答案:

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

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


 类似资料:
  • 下面是在没有fxml的情况下重新启动JavaFX应用程序的代码。 但是,我想用fxml实现这一点。 我不知道如何使用fxml应用此代码。 我的代码。 Main.java 控制器。JAVA 样品fxml 我想重新启动我的JavaFX应用程序。 我不知道如何使用fxml应用此代码。 如何使用fxml重新启动JavaFX应用程序?

  • 当我运行我的JavaFX程序时,我的第一个按钮总是被选中(见周围的蓝线):图片形式开始 当我使用箭头键将播放器选项设置为左或右时,左或右按钮将被选中: 在我按下右箭头 没有选中任何按钮我如何运行程序

  • 我想知道是否有任何“简单”的方法,我可以设置垂直滚动条“滚动”一个特定的数量,按下按钮,或真正的任何事件在所有。 例如,我有一个应用程序,它有一个侧栏,侧栏上的一个选项是设置。Settings有子项,我想添加点击其中一个子项的功能,它将打开Settings页面,并自动向下滚动到该子项所在页面上的特定点。

  • 我正在使用JFrame、JPanel、JButton和actionListener编写一个游戏,我希望有一个按钮,按下后重新启动游戏。基本上,我希望当前Jframe关闭并重新打开一个新的Jframe。我希望它像一个按钮,你按下开始一个新的游戏。这是我的密码: actionListener: 谢谢你抽出时间。

  • 点击按钮时,Firebase Auth不会在上启动。 它仅在重新打开应用程序时有效。 出了什么问题?

  • 问题内容: 我一直试图在Eclipse中制作我的第一个android应用程序(一个简单的温度转换器),但是当我单击手机上的按钮时,该应用程序崩溃了。这是完整的Java代码 单击按钮时的LogCat 最后是按钮的xml 我不确定如何解决此问题,因此希望有人可以提供帮助。谢谢。 问题答案: 首先初始化您的按钮,然后将onclicklistener设置为它们 同样设置另一个按钮