Comment relancer une application JavaFX. quand on clique sur un bouton
Je suis passé par presque tous les post ici sur la question, mais la plupart d'entre eux n'a pas d'expliquer quoi faire correctement.
À la question:
J'ai créé un javaFX application, un jeu de dés, le joueur humain contre ordinateur, mais pendant tout le temps tout en jouant le jeu, le joueur humain doit être en mesure de cliquer sur le bouton "nouveau jeu" et ce qu'il doit faire est de recommencer le jeu depuis le début.
J'ai essayé de relancer le stade de nouveau, mais dans javafx nous ne pouvons pas appeler la méthode de lancement à deux reprises.
1)Est-il un moyen pour que je puisse mettre en œuvre ce, sans avoir à redémarrer l'ensemble de l'application?
2)si non, comment puis-je redémarrer l'application complètement à l'aide d'un clic de bouton?
Classe principale
public class Main {
public static void main(String[] args) {
GameUI gameUI = new GameUI();
gameUI.launch(GameUI.class, args);
}
GameUI
(j'ai enlevé beaucoup de codes à partir de cette classe pour faire court. codes qui, je pense, assez pour donner une idée est inclus. désolé si c'est trop 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;
}
}
p.s je suis très nouveau à JavaFX et un peu nouveau pour la programmation java.
OriginalL'auteur Raveen Athapaththu | 2016-01-14
Vous devez vous connecter pour publier un commentaire.
Vous déjà remarqué que vous ne pouvez pas faire la procédure de lancement de nouveau. Donc votre meilleure option est de réécrire la classe d'application et de déplacer l'initialisation de la logique à une nouvelle méthode:
Notes
launch()
est unstatic
méthode et vous ne devez pas créer une instance de votre classe d'application-vous pour cette raison. UtilisationApplication.launch(GameUI.class, args);
place et laissez la méthode de charge de la création de laGameUI
instance.Application
.sont des moyens pour appeler du code de l'application thread (E. g.
Platform.runLater
).Mais il n'y a vraiment pas beaucoup de différence, si vous déplacez un peu de code pour une autre classe.E.g. vous pourriez écrire une usine qui crée la scène et tout ce que vous feriez dans l'start
méthode est mise en scène dans leStage
et de la montrer.Bien sûr, vous devez être prudent en raison de l'application du cycle de vie/threads différents, mais à mon humble avis ça vaut le coup.Peut-être que vous devriez commencer avec la version originale et de la lunette à l'aide de la délégation modèle (avec le constructeur, début [, init?]) et puis, lunette le code étape par étape.OriginalL'auteur fabian