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

单击按钮时如何重新启动JavaFX应用程序,java,javafx,restart,application-restart,Java,Javafx,Restart,Application Restart,关于这件事,我几乎浏览了这里的每一篇帖子,但大多数帖子都没有解释该怎么做。 对该问题: 我创建了一个javaFX应用程序,一个骰子游戏,人类玩家对计算机,但是在玩游戏的任何时候,人类玩家都应该能够点击“新建游戏”按钮,它应该做的是从一开始就重新启动游戏 我再次尝试重新启动该阶段,但在javafx中,我们不能调用启动方法两次 1)有没有一种方法可以在不重新启动整个应用程序的情况下实现此功能? 2)如果没有,如何使用按钮单击完全重新启动应用程序? 主类 public class Main { pub

关于这件事,我几乎浏览了这里的每一篇帖子,但大多数帖子都没有解释该怎么做。 对该问题:

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

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

1)有没有一种方法可以在不重新启动整个应用程序的情况下实现此功能?

2)如果没有,如何使用按钮单击完全重新启动应用程序?

主类

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

    gameUI.launch(GameUI.class, args);

}   
加梅伊 (我从这个类中删除了许多代码以使其简短。我认为足以给出一个想法的代码也包括在内。如果太长,请道歉。)

公共类GameUI扩展应用程序{
//所有btn和标签声明
//为必要的类创建实例
私密场景;
@凌驾
public void start(Stage primaryStage)引发异常{
//为玩家和计算机显示骰子
setLabelsPlyr(diesP);
设置标签(diesC);
btnThrow=新按钮(“抛出”);
btnThrow.setPrefSize(70,40);
//执行投掷动作
btnThrow.setOnAction(e->{
//设置和显示模具
DieClass[]com=getNewDiCarrc();
lblDiceOneC.setGraphic(新的ImageView(diesC[0].getDieImageC());
//等等。。。。。
DieClass[]playerAr=GetNewDiCerRP();
lblDiceOnePlyr.setGraphic(新的ImageView(diesP[0].getDieMageP());
//等等。。。
});
btnNewGame=新按钮(“新游戏”);
btnNewGame.setOnAction(e->{
**//在这里做什么**
});
//设置布局
GridPane GridPane=新建GridPane();
添加(lblComputer,0,0);
//等等。。。。。
场景=新场景(网格窗格,1100400);
初级阶段。场景(场景);
初级阶段。设置标题(“骰子游戏”);
primaryStage.show();
}
//其他一些方法
公共无效设置标签(DieClass[]模具){
for(int i=0;i对于(int i=0;i您已经注意到无法再次执行启动过程。因此,您最好的选择是重写应用程序类,并将初始化逻辑移动到新方法:

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创建移动到与应用程序类不同的类可能是更好的设计。这种方式代码的重用更容易,因为它不需要创建
    应用程序
    的子类的实例

感谢您详尽的回答,关于将UI创建移动到其他类,我尝试过,但当我这样做时,我无法更新UI,即无法更改(在程序内)但它不会在UI中得到更新。据我所知,这是因为应用程序作为线程运行,而我们不能在线程运行时进行更新。我当然想将UI部分移动到另一个类,但不能这样做。@ravenathapaththu:有一些方法可以从应用程序线程调用代码(例如,
Platform.runLater
)。但是如果你把一些代码移到另一个类中,实际上没有太大区别。例如,你可以编写一个工厂来创建场景,你在
start
方法中要做的就是将场景放在
Stage
中并显示出来。当然,你必须小心,因为应用程序的生命周期/不同的线程,但我认为这是值得的t、 也许您应该使用委托模式(使用构造函数,start[,init?])从原始版本和折射器开始,然后逐步折射代码。
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);
}