Compiler in der JavaFX stop() Methode warten lassen bist eine Aktion in einer anderen Scene gemacht

Java4win

Aktives Mitglied
Hey,
Mein Programm sieht wie folgt aus:
1.) Es öffnet sich ein Fenster und die Scene in diesem Fenster.
Das Fenster beinhaltet 3 Button: Easy, Medium und Hard
um die Schwierigkeit festzulegen.

Danach kommt direkt der SourceCode für die mainScene (Hier wird ein Array aus Buttons erzeugt.)
Nun das Problem...
Die Größe des Arrays basiert auf dem Schwierigkeitsgrad der in der vorherigen Scene angeklickt wurde.

Der Compiler wartet nun jedoch nicht bist der Nutzer seine Eingabe gemacht hat, sonder versucht direkt das Array zu erstellen. Also wie bekomme ich es hin, dass der Compiler "wartet" bist der Nutzer die Eingabe in der ersten Scene erledigt hat?

Ich habe eine Lösung gefunden jedoch eine sehr katastrophale.
Java:
easy.setOnAction(new EventHandler<ActionEvent>(){

            @Override
            public void handle(ActionEvent arg0) {
                clip.play();
                boardSize = 4;
                box = new GridPane(); // Layout, welches in der mainScene ist
                box.setHgap(boardSize); 
                box.setVgap(boardSize);
                mainScene = new Scene(box,Toolkit.getDefaultToolkit().getScreenSize().height,Toolkit.getDefaultToolkit().getScreenSize().width);
                playButtons = new YellowButton[boardSize][boardSize];
                setMainSceneButton(playButtons); //Methode welche die Buttons auf das Array Setzt (Stand vorher in der stop())
                primaryStage.setScene(mainScene);
            }
        });

Ich habe einfach die Erstellung des Array in eine Methode gepackt und die lasse ich als letztes aufrufen, wenn der Nutzer auf den Button klickt.
Ich kann jedoch jetzt nichts mehr wirklich in die stop() Methode unter den handler schreiben und müsste alles IN den Handler reinschreiben und das kann es doch irgendwie nicht sein😀

Ich wette die Lösung ist super einach😀
 
Zuletzt bearbeitet:
Ehrlich gesagt versteh ich deine Erklärung noch nicht. Der Code ist auch nicht wirklich hilfreich, da sieht man weder das Füllen des Arrays, noch die stop-Methode, die du erwähnst, noch die zweite Scene...
Kannst du noch mal versuchen, das anders zu beschreiben?


(BTW, der Compiler kompiliert nur, und führt den Code nicht auf. Dein Problem tritt erst zur Laufzeit auf, da hat der Compiler nichts mehr mit zu tun)
 
(BTW, der Compiler kompiliert nur, und führt den Code nicht auf. Dein Problem tritt erst zur Laufzeit auf, da hat der Compiler nichts mehr mit zu tun)
Oh, dann möchte ich den stoppen, der den Programmcode ausführt, der Thread?

Wir hatten JavaFX erst eine Vorlesung um dementsprechend habe ich wahrscheinlich noch nicht genug Informationen, wie ich damit jetzt umgehen soll aber ich versuche es noch einmal etwas spezifischer zu beschreiben.

Die Gesamte start() Methode, wie sie Ursprünglich war:
(Die Grünen Kommentare sind am wichtigsten)
Java:
@Override
    public void start(Stage primaryStage) throws Exception {
             
    //Attributes for the Start Scene
        //Start Scene
        AnchorPane startBox = new AnchorPane();
        Scene startScene = new Scene(startBox);
        box = new GridPane();

        //startScene Buttons
        Button easy = new Button("Easy");
        Button medium = new Button("Medium");
        Button hard = new Button("Hard");
     
        VBox vBox = new VBox(10, easy, medium, hard);
        startBox.getChildren().add(vBox);
        AnchorPane.setRightAnchor(vBox, 10.0);
        AnchorPane.setLeftAnchor(vBox, 10.0);
 
        primaryStage.setScene(startScene);

       /** Hier soll der Benutzer eine Eingabe machen bzw. auf einen Button klicken,
der die Schwierigkeit angibt. Dadurch wird dann die Größe des Arrays gesetzt auf dem das Spiel statt findet.
Je größer das Spielfeld desto schwerer das Spiel.
Jedoch wird in der Laufzeit natürlich nicht gewartet, bis der Nutzer eine Eingabe gemacht hat und läuft weiter. **/

        //Setting states for the EASY Button from the startScene
        buttonStartSceneStates(easy);
        easy.setOnAction(new EventHandler<ActionEvent>(){

            @Override
            public void handle(ActionEvent arg0) {
                clip.play();
                boardSize = 4;
            }
        });
     
        //Setting states for the MEDIUM Button from the startScene
        buttonStartSceneStates(medium);
        medium.setOnAction(new EventHandler<ActionEvent>(){
            @Override
            public void handle(ActionEvent arg0) {
                clip.play();
                boardSize = 6;
            }
        });
        //Setting states for the MEDIUM Button from the startScene
        buttonStartSceneStates(hard);
        hard.setOnAction(new EventHandler<ActionEvent>(){
            @Override
            public void handle(ActionEvent arg0) {
                clip.play();
                boardSize = 8;
             
            }
        });
     
/** Hier wird direkt weiter gemacht, jedoch hat zu dieser Zeit die Variable "boardSize" den default Wert 0 und dementsprechend werden auch keine Button bzw. kein ordentlichen GridPane Raster erstellt.
Also dieser Teil darf erst ausgeführt werden, wenn der Benutzer auf einen der Button aus der startScene geklickt hat. **/
        box = new GridPane();
        box.setHgap(boardSize);
        box.setVgap(boardSize);
        mainScene = new Scene(box,Toolkit.getDefaultToolkit().getScreenSize().height,Toolkit.getDefaultToolkit().getScreenSize().width);
        playButtons = new YellowButton[boardSize][boardSize];

     
        for(int i = 0; i < playButtons.length; i++) {
            for(int j = 0; j < playButtons[0].length; j++) {
                int a = i;
                int b = j;
                playButtons[i][j] = new YellowButton();
                playButtons[i][j].setStyle(cssBlackPropertys);
                playButtons[i][j].setOnMouseClicked(new EventHandler<MouseEvent>() {

                    @Override
                    public void handle(MouseEvent e) {
                        clip.play();
                     
                                    switchColors(playButtons[a][b]);   //center
                                    if(a-1 >= 0) {
                                    switchColors(playButtons[a-1][b]); //bottom
                                    }
                                    if(a+1 < playButtons.length){
                                     switchColors(playButtons[a+1][b]); //top
                                    }
                                    if(b-1 >= 0) {
                                    switchColors(playButtons[a][b-1]); //left
                                    }
                                    if(b+1 < playButtons[0].length) {
                                    switchColors(playButtons[a][b+1]);
                                    }//right
                                    System.out.println(a+" / "+b);
                             
                        if(hasWon(playButtons)) {
                            System.out.println("Glückwunsch, Sie haben es geschafft!");
                        }
                    }
                 
                });
                playButtons[i][j].setPrefSize(1000,1000);
                box.add(playButtons[i][j],i,j);
            }
        }
     
        primaryStage.setScene(mainScene);
        primaryStage.show();
    }

Ich hoffe es wurde jetzt etwas verständlicher.
 
Die Lösung (bzw. einen großen Teil davon) hast Du doch schon formuliert:
Nur an der Umsetzung scheitert es bisher noch🙂
Wie gesagt ich könnte nun all den Programmcode der ausgeführt werden soll in den ActionListener implementieren (Hatte ich ja auch zum Schluss). Jedoch fand ich diese Lösung extrem umständlich und dachte mir das es mit Sicherheit auch noch einfacher geht.

Da ich 3 ActionListener besitze (easy,medium,hard) müsste ich zusätzlich in jedem den gleichen Programmcode schreiben.
 
1. Du hast ggf. drei ActionListener-Objekte. Keiner zwingt Dich, dafür drei Klassen zu schreiben.
2. Keiner zwingt Dich, in den ActionListenern eine Methode nicht aufzurufen.
 

Zurück
Oben