我在这里几乎每一篇文章都谈到了这个问题,但大多数都没有解释要做什么.
对于这个问题:
我创建了一个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编程有些新意.
最佳答案 您已经注意到您无法再次启动启动过程.因此,您最好的选择是重写应用程序类并将初始化逻辑移动到新方法:
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()是一个静态方法,因此您不应自己创建应用程序类的实例.使用Application.launch(GameUI.class,args);相反,让该方法处理GameUI实例的创建.
>将UI创建移动到与应用程序类不同的类可能是更好的设计.这样,代码的重用更容易,因为它不需要创建Application子类的实例.