JavaFX Scene - Buttonklick abwarten

javapolizei

Mitglied
Hallo,
folgendes Problem:

Ich arbeite an einem Tunierverwaltungsprogramm und möchte in der GUI wie folgt vorgehen
  1. Tuniermodus auswählen
  2. Mannschaft erstellen (Mannschaftsname, SpielerAnzahl)
  3. Trainer erstellen --> nur bei index = 0
  4. Spieler erstellen --> bei allen Indizes > 0 bis zur eingegebenen SpielerAnzahl
Wenn aktuell die Schleife ausgeführt wird, dann "rennt" mir das Programm durch alle Fenster durch und ich sehe nur noch das Eingabefenster für den letzten Spieler. Meine Frage ist also, wie ich es schaffe, dass bei der Scene der Trainereingabe pausiert wird bis der Button "Submit" geklickt wird, dann soll zur Eingabe des 1. Spielers gewechselt werden, erneutes Warten auf klicken von "Submit", wechsel zur Eingabe des 2. Spielers, usw.

Ich hatte probiert bei den jeweiligen neuen Scenen showAndWait() zu benutzen, dann wurde zwar bei der Trainereingabe gestoppt aber eine Exception geworfen und das Programm war damit auch am Ende.

Die folgenden Code-Auszüge sind nur aus dem JavaFX - Teil. Der eigentliche Programmcode (Mannschaft, Trainer, Spieler usw.) sollte nicht relevant sein denke ich, da ja hier nur die Konstruktoren davon aufgerufen werden.

Methode mannschaftErzeugen
Java:
private Mannschaft mannschaftErzeugen(String mannschaftsname, String spielerAnzahl) {
        int zahlSpieler = Integer.parseInt(spielerAnzahl);
       
        Mannschaft aktuell = new Mannschaft(mannschaftsname, zahlSpieler);
       
        for (int i = 0; i < zahlSpieler+1; i++) {
            if (i == 0) {
                aktuell.mitglieder[i] = trainerErzeugen(mannschaftsname);
            } else if (i > 0){
                aktuell.mitglieder[i] = spielerErzeugen(mannschaftsname, i);
            }
        }   
        return aktuell;
    }

Methode trainerErzeugen
Java:
private Trainer trainerErzeugen(String mannschaftsname) {
       
        //Trainer erzeugen
        GridPane grid2 = new GridPane();
        grid2.setPadding(new Insets(10, 10, 10, 10));
        grid2.setHgap(13);
        grid2.setVgap(8);
       
        // Label vorname
        Label vorname = new Label("Vorname:");
        grid2.add(vorname, 0, 0);
       
        // Field vorname
        TextField vornameInput = new TextField();
        vornameInput.setPromptText("Vorname eingeben");
        grid2.add(vornameInput, 1, 0);
       
        // Label nachname
        Label nachname = new Label("Nachname:");
        grid2.add(nachname, 0, 1);
       
        // Field Nachname
        TextField nachnameInput = new TextField();
        nachnameInput.setPromptText("Nachname eingeben");
        grid2.add(nachnameInput, 1, 1);
       
        // Button submit
        Button submit2 = new Button("Submit");
        grid2.add(submit2, 1, 2);
        submit2.setOnAction( e -> {
            trainerAktuell = new Trainer(this.mannschaftsname, vornameInput.getText(), nachnameInput.getText());
        });   
       
        trainer = new Scene(grid2);
       
        window.setScene(trainer);
        window.showAndWait();
       
        return trainerAktuell;
    }

Methode spielerErzeugen
Java:
private Spieler spielerErzeugen(String mannschaftsname, int index) {
        //Spieler erzeugen
        GridPane grid3 = new GridPane();
        grid3.setPadding(new Insets(10, 10, 10, 10));
        grid3.setHgap(13);
        grid3.setVgap(8);
       
        //Label index
        Label indexSpieler = new Label("Bitte geben Sie den " + index + ". Spieler ein:");
        grid3.add(indexSpieler, 0, 0);
       
        // Label vorname
        Label vornameSpieler = new Label("Vorname:");
        grid3.add(vornameSpieler, 0, 1);
       
        // Field vorname
        TextField vornameSpielerInput = new TextField();
        vornameSpielerInput.setPromptText("Vorname eingeben");
        grid3.add(vornameSpielerInput, 1, 1);
       
        // Label nachname
        Label nachnameSpieler = new Label("Nachname:");

        grid3.add(nachnameSpieler, 0, 2);
       
        // Field Nachname
        TextField nachnameSpielerInput = new TextField();
        nachnameSpielerInput.setPromptText("Nachname eingeben");
        grid3.add(nachnameSpielerInput, 1, 2);
       
        // Label Trikotnummer
        Label trikotnummer = new Label("Trikotnummer:");
        grid3.add(trikotnummer, 0, 3);
       
        // Field Trikotnummer
        TextField trikotnrInput = new TextField();
        trikotnrInput.setPromptText("Trikotnummer eingeben");
        grid3.add(trikotnrInput, 1, 3);
       
        // Button submit
        Button submit3 = new Button("Submit");
        submit3.setOnAction( e -> {
            spielerAktuell = new Spieler(this.mannschaftsname, vornameSpielerInput.getText(), nachnameSpielerInput.getText(),
                                            Integer.parseInt(trikotnrInput.getText()));
        });
        grid3.add(submit3, 1, 4);
       
        // Scene
        spielerEingabe = new Scene(grid3);
        window.setScene(spielerEingabe);
        window.showAndWait();
       
        return spielerAktuell;
    }


Start - Methode

Java:
@Override
    public void start(Stage primaryStage) throws Exception {
        window = primaryStage;
        window.setTitle("Tunierverwaltung");
       
        //Start - Auswahl Pokalmodus oder AlleGegenAlle
        HBox hbox = new HBox();
       
        Button alleGegenAlle = new Button("AlleGegenAlle");
        alleGegenAlle.setOnAction( e -> window.setScene(mannschaftsEingabe));
       
        Button pokalmodus = new Button("Pokalmodus");
        pokalmodus.setOnAction(e -> window.setScene(mannschaftsEingabe));
       
        hbox.getChildren().addAll(alleGegenAlle, pokalmodus);
        start = new Scene(hbox);
       
        //---------------------------------------------------------------------------
       
        //Mannschaft erzeugen
        GridPane grid1 = new GridPane();
        grid1.setPadding(new Insets(10, 10, 10, 10));
        grid1.setHgap(13);
        grid1.setVgap(8);
       
        //Label mannschaftsname
        Label mannschaftsname = new Label("Mannschaftsname:");
        grid1.add(mannschaftsname, 0, 0);
       
        //Field mannschaftsname
        TextField mname = new TextField();
        mname.setPromptText("Mannschaftsname eingeben");
        grid1.add(mname, 1, 0);
       
        //Label Anzahl der Spieler
        Label anzahlSpieler = new Label("Anzahl der Spieler:");
        grid1.add(anzahlSpieler, 0, 1);

        //Field Anzahl der Spieler
        TextField zahlSpieler = new TextField();
        zahlSpieler.setPromptText("Spieleranzahl eingeben");
        grid1.add(zahlSpieler, 1, 1);
       
        //Button submit
        Button submit1 = new Button("Submit");
        submit1.setOnAction( e -> {
            mannschaftErzeugen(mname.getText(), zahlSpieler.getText());
        });    
        grid1.add(submit1, 1, 2);
       
        mannschaftsEingabe = new Scene(grid1);
       
        //---------------------------------------------------------------------------
       
       
   
        //---------------------------------------------------------------------------
       
       
       
        //---------------------------------------------------------------------------
       
        window.setScene(start);
        window.show();
   
    }


IDE ist Eclipse, Betriebssystem Win 10.
 
hallo,
also ich würde für die Eingabe des Trainers und der Spieler jeweils ein eigenes Dialogfenster öffnen das modal gestartet wird und die Daten dann bei betätigen eines "OK" Buttons zurück gibt.
 
Okay, danke für den Vorschlag.
Habs jetzt so geändert, dass die Eingabe von Mannschaft, Trainer und den Spielern jeweils in einem eigenen Fenster erfolgt. Das funktioniert auch so weit, also die komplette Schleife wird durchlaufen, so wie das gedacht war, aber am Ende der Spielereingabe gibt's eine neue Exception.

Java:
java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(Unknown Source)
    at com.sun.javafx.application.LauncherImpl.launchApplication(Unknown Source)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at sun.launcher.LauncherHelper$FXHelper.main(Unknown Source)
Caused by: java.lang.NullPointerException
    at application.GUI.main(GUI.java:31)
    ... 11 more
Exception running application application.GUI

Ich weiß ehrlich gesagt woran das liegt. Kann es sein, dass es was damit zu tun hat das alle Fenster (bzw. Stages) geschlossen werden?
Das sollte ja aber auch passieren, denn nach der Eingabe des letzten Spielers ist ja der aktuelle Vorgang beendet.
 
Es bedeutet, dass das Objekt, auf dem du etwas zu tun versuchst, noch nicht initialisiert wurde. Das Ganze passiert in Zeile 32 deiner Klasse GUI.java.
Steht doch alles da im StackTrace...
 
Mit der Interpretierung des StackTrace hab ich noch nicht ganz so viel Erfahrung...
Aber danke auf jeden Fall, hab den Fehler gefunden und behoben! (Ich wollte testen ob die Werte die ich zuvor eingegeben hatte auch gespeichert wurden und dann diese abfrage. Bei der Abfrage hatte ich nen Fehler gemacht)
 

Zurück
Oben