Wie starten Sie eine JavaFX-Anwendung, wenn auf eine Schaltfläche geklickt wird
Ging ich durch fast jeden Beitrag hier in Bezug auf die Sache, aber die meisten von Ihnen nicht erklären, was zu tun richtig.
Auf die Frage:
Erstellte ich eine javaFX-Anwendung, ein Würfel-Spiel, menschliche Spieler gegen computer, aber während jeder Zeit während des Spiels, das menschliche Spieler sollte in der Lage sein, um klicken Sie auf die Schaltfläche "neues Spiel" und was Sie tun sollten, ist, starten Sie das Spiel von Anfang an.
Ich versuchte Wiederbelebung der Bühne wieder, aber in javafx können wir nicht nennen, die Start-Methode zweimal.
1)gibt es eine Möglichkeit, kann ich dies umsetzen, ohne einen Neustart der gesamten Anwendung?
2)wenn nicht, wie kann ich die Anwendung neu starten, komplett mit einem button-Klick?
Main-Klasse
public class Main {
public static void main(String[] args) {
GameUI gameUI = new GameUI();
gameUI.launch(GameUI.class, args);
}
GameUI
(ich entfernt viele codes aus dieser Klasse um es kurz zu machen. codes, die ich denke, genug um eine Vorstellung zu geben, ist im Lieferumfang enthalten. sorry wenn es zu lang ist.)
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 ich bin sehr neu in JavaFX und etwas neues zu java-Programmierung.
InformationsquelleAutor Raveen Athapaththu | 2016-01-14
Du musst angemeldet sein, um einen Kommentar abzugeben.
Du schon gemerkt, dass Sie nicht die Start-Vorgang erneut. Daher ist die beste option, die Anwendung neu zu schreiben-Klasse und verschieben Sie die Initialisierungs-Logik auf eine neue Methode:
Notes
launch()
ist einstatic
Methode, und Sie sollten nicht erstellen Sie eine Instanz Ihrer Anwendung Klasse sich aus diesem Grund. VerwendenApplication.launch(GameUI.class, args);
statt und lassen Sie die Methode handle der Schaffung desGameUI
Instanz.Application
.sind Möglichkeiten zum aufrufen von code aus der Anwendungs-thread (E. g.
Platform.runLater
).Aber es ist wirklich nicht viel Unterschied, wenn Sie verschieben Sie code in einer anderen Klasse.E.g. Sie schreiben, könnte ein Werk schafft, dass die Szene und alles, was Sie tun würde, in derstart
Methode wird die Szene, in derStage
und zeigen Sie es.Natürlich muss man vorsichtig sein, da der application lifecycle/verschiedene threads, aber IMHO lohnt es sich.Vielleicht sollten Sie beginnen, mit der original-version und-Refraktor, mit dem delegation-pattern (mit Konstruktor, start [, init?]) und dann-Refraktor, den code Schritt für Schritt durch.InformationsquelleAutor fabian