Java Scene - Buttonklick abwarten

Peaceful-Panda

Cadet 1st Year
Registriert
Dez. 2014
Beiträge
14
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
Code:
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
Code:
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
Code:
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
Code:
@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();
   
    }
 
Bau dir doch einfach eine Methode , die einen Wahrheitswert beinhaltet, dieser wird Anfangs, bei der Erzeugung deines Objektes auf False gesetzt, und erst wenn die Taste "Submit" gedrückt wird, auf wahr.

Dann machst du davon noch einen getter, den du dann in einer While schleife abfragen lässt

irgendwie sowas:

Code:
private Spieler spielerErzeugen(String mannschaftsname, int index) {
        //Spieler erzeugen


        Boolean isReady = false;


        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 -> {


 isReady = false,


            spielerAktuell = new Spieler(this.mannschaftsname, vornameSpielerInput.getText(), nachnameSpielerInput.getText(),
                                            Integer.parseInt(trikotnrInput.getText()));
        });
        grid3.add(submit3, 1, 4);
       
       while(!isReady()){};

        // Scene
        spielerEingabe = new Scene(grid3);
        window.setScene(spielerEingabe);
        window.showAndWait();
       
        return spielerAktuell;
    }


Geht natürlich auch noch schöner...
 
Zuletzt bearbeitet:
Zurück
Oben