# JavaFX mit JDK 12



## Dainka (15. Jun 2019)

Hi,

nach unzähligen Foren hoffe ich dass mir hier jemanden weiterhelfen kann.
Meine Java Kenntnisse sind grad nicht die größten weswegen ich selbst mit kleinsten Fehlern schon bisschen länger brauche..

Mir werden folgende Fehler angezeigt:



```
"C:\Program Files\Java\jdk-12.0.1\bin\java.exe" --add-modules javafx.base,javafx.graphics --add-reads javafx.base=ALL-UNNAMED --add-reads javafx.graphics=ALL-UNNAMED -Djava.library.path=C:\Users\kirin\Downloads\openjfx-12.0.1_windows-x64_bin-sdk\javafx-sdk-12.0.1 "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2019.1.1\lib\idea_rt.jar=52610:C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2019.1.1\bin" -Dfile.encoding=UTF-8 -classpath C:\Users\kirin\IdeaProjects\HSHL\out\production\HSHL;C:\Users\kirin\Downloads\openjfx-12.0.1_windows-x64_bin-sdk\javafx-sdk-12.0.1\lib\src.zip;C:\Users\kirin\Downloads\openjfx-12.0.1_windows-x64_bin-sdk\javafx-sdk-12.0.1\lib\javafx-swt.jar;C:\Users\kirin\Downloads\openjfx-12.0.1_windows-x64_bin-sdk\javafx-sdk-12.0.1\lib\javafx.web.jar;C:\Users\kirin\Downloads\openjfx-12.0.1_windows-x64_bin-sdk\javafx-sdk-12.0.1\lib\javafx.base.jar;C:\Users\kirin\Downloads\openjfx-12.0.1_windows-x64_bin-sdk\javafx-sdk-12.0.1\lib\javafx.fxml.jar;C:\Users\kirin\Downloads\openjfx-12.0.1_windows-x64_bin-sdk\javafx-sdk-12.0.1\lib\javafx.media.jar;C:\Users\kirin\Downloads\openjfx-12.0.1_windows-x64_bin-sdk\javafx-sdk-12.0.1\lib\javafx.swing.jar;C:\Users\kirin\Downloads\openjfx-12.0.1_windows-x64_bin-sdk\javafx-sdk-12.0.1\lib\javafx.controls.jar;C:\Users\kirin\Downloads\openjfx-12.0.1_windows-x64_bin-sdk\javafx-sdk-12.0.1\lib\javafx.graphics.jar -p C:\Users\kirin\Downloads\openjfx-12.0.1_windows-x64_bin-sdk\javafx-sdk-12.0.1\lib\javafx.base.jar;C:\Users\kirin\Downloads\openjfx-12.0.1_windows-x64_bin-sdk\javafx-sdk-12.0.1\lib\javafx.graphics.jar spiel.Spiel
Exception in Application start method
java.lang.reflect.InvocationTargetException
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:567)
    at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:464)
    at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:363)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:567)
    at java.base/sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:1051)
Caused by: java.lang.RuntimeException: Exception in Application start method
    at javafx.graphics/com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:900)
    at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication$2(LauncherImpl.java:195)
    at java.base/java.lang.Thread.run(Thread.java:835)
Caused by: java.lang.IllegalAccessError: class com.sun.javafx.fxml.FXMLLoaderHelper (in unnamed module @0x5adda196) cannot access class com.sun.javafx.util.Utils (in module javafx.graphics) because module javafx.graphics does not export com.sun.javafx.util to unnamed module @0x5adda196
    at com.sun.javafx.fxml.FXMLLoaderHelper.<clinit>(FXMLLoaderHelper.java:38)
    at javafx.fxml.FXMLLoader.<clinit>(FXMLLoader.java:2056)
    at spiel.Spiel.start(Spiel.java:28)
    at javafx.graphics/com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$9(LauncherImpl.java:846)
    at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runAndWait$12(PlatformImpl.java:455)
    at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$10(PlatformImpl.java:428)
    at java.base/java.security.AccessController.doPrivileged(AccessController.java:389)
    at javafx.graphics/com.sun.javafx.application.PlatformImpl.lambda$runLater$11(PlatformImpl.java:427)
    at javafx.graphics/com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:96)
    at javafx.graphics/com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at javafx.graphics/com.sun.glass.ui.win.WinApplication.lambda$runLoop$3(WinApplication.java:174)
    ... 1 more
Exception running application spiel.Spiel

Process finished with exit code 1
```


Danke im Voraus..


----------



## Dainka (15. Jun 2019)

Einfach melden falls mehr an infos benötigt wird.


----------



## mrBrown (15. Jun 2019)

Hast du eine `module-info.java` erstellt?


----------



## Dainka (15. Jun 2019)

mrBrown hat gesagt.:


> Hast du eine `module-info.java` erstellt?



Nein. Ich wüsste wie ich eine erstelle, jedoch nicht weiteres.


----------



## mrBrown (15. Jun 2019)

Der Fehler liegt aktuell daran, das JavaFX modularisiert ist, deine Applikation aber nicht, deshalb wirft das in diesem Fall Fehler.
Du hast zwei Möglichkeiten: entweder das Modulsystem ganz nutzen, oder es garnicht nutzen.

Mit Modulsystem: eine module-info erstellen und die passenden Dinge angeben, dann sollte das mit IntelliJ ausführbar sein.



Spoiler: module-info



Wenn du nur das Package "spiel" hast, müsste die grob so aussehen:

```
module spiel {
    requires javafx.controls;
    requires javafx.fxml;
    exports spiel to javafx.graphics;
}
```

Je nachdem was du nutzt, musst du das natürlich noch anpassen.



Ohne Modulsystem: der Klasse Spiele eine explizite Main-Methode spendieren, und zusätzliche eine "Main"-Klasse erstellen, die eine main-Methode enthält, die nur die Main-Methode in Spiel aufruft. Zum starten dann immer die neue main-Methode benutzen.



Spoiler: Klassen



Eine zusätzliche Main-Klasse mit main-Methode:

```
public class Main {
    public static void main(String[] args) {
        Spiel.main(args);
    }
}
```

Die Application, ergänzt um eine explizite main-Methode:

```
public class Spiel extends Application {
    public static void main(String[] args) {
        Application.launch(args);
    }

   //der Rest aus der Klasse
}
```


----------



## Dainka (15. Jun 2019)

Habe eine module-info.java angelegt.
Nun tritt vorliegende Meldung hervor..


----------



## Dainka (15. Jun 2019)




----------



## mrBrown (15. Jun 2019)

Das ist jetzt immerhin mal eine Fehlermeldung, mit der man arbeiten kann  

Was steht denn in der Zeile, in der die Exception geworfen wird?


----------



## Dainka (16. Jun 2019)

Hier die Exception.


----------



## Dainka (16. Jun 2019)

und es wird nur noch diese Fehlermeldung angezeigt.
Ich habe bereits per google versucht den Fehler auszumerzen jedoch bislang erfolglos..


----------



## mrBrown (16. Jun 2019)

Code bitte in Code-Tags ([CODE=java]//code[/CODE]) und nicht als Screenshot Posten.


----------



## Dainka (16. Jun 2019)

mrBrown hat gesagt.:


> Code bitte in Code-Tags ([CODE=java]//code[/CODE]) und nicht als Screenshot Posten.




```
package spiel;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;
//import spiel.brett.Grafik;

import java.io.*;
import java.util.ArrayList;
import java.util.List;

public class Spiel extends Application {
    private static AnchorPane root;
    private static List<Pane> liste = new ArrayList<Pane>();
    private static int indexcurrent = 0;
    Spieler sp1, sp2, sp3, sp4;

    static Spiel spielen = new Spiel();
             // aufgrund der Zugriffe in den Controllerclassen Statisch


    @Override
    public void start(Stage primaryStage) throws Exception {
        try {
            root = FXMLLoader.load(getClass().getClassLoader().getResource("/spiel/FXML.fxml"));// lädt start Paine

            liste.add(FXMLLoader.load(getClass().getResource("/spiel/Monopoly.fxml")));// hier wird eine Liste mit allen zu ladenen Scenen erstellt
            liste.add(FXMLLoader.load(getClass().getResource("/spiel/AuswahlMenü.fxml")));
            liste.add(FXMLLoader.load(getClass().getResource("/spiel/FigurenMenü.fxml")));
            liste.add(FXMLLoader.load(getClass().getResource("/spiel/AuswahlQuiz.fxml")));

            liste.add(FXMLLoader.load(getClass().getResource("DesignErsteSemster.fxml")));
            liste.add(FXMLLoader.load(getClass().getResource("DesignZweiteSemster.fxml")));
            liste.add(FXMLLoader.load(getClass().getResource("DesignDritteSemster.fxml")));
            liste.add(FXMLLoader.load(getClass().getResource("DesignVierteSemster.fxml")));
            liste.add(FXMLLoader.load(getClass().getResource("DesignFunfteSemster.fxml")));
            liste.add(FXMLLoader.load(getClass().getResource("DesignSechsteSemster.fxml")));
            liste.add(FXMLLoader.load(getClass().getResource("DesignSiebteSemster.fxml")));

            liste.add(FXMLLoader.load(getClass().getResource("InfoErsteSemster.fxml")));
            liste.add(FXMLLoader.load(getClass().getResource("InfoZweiteSemster.fxml")));
            liste.add(FXMLLoader.load(getClass().getResource("InfoDritteSemster.fxml")));
            liste.add(FXMLLoader.load(getClass().getResource("InfoVierteSemster.fxml")));
            liste.add(FXMLLoader.load(getClass().getResource("InfoFunfteSemster.fxml")));
            liste.add(FXMLLoader.load(getClass().getResource("InfoSechsteSemster.fxml")));
            liste.add(FXMLLoader.load(getClass().getResource("InfoSiebteSemster.fxml")));

            liste.add(FXMLLoader.load(getClass().getResource("HSHLErsteSemster.fxml")));
            liste.add(FXMLLoader.load(getClass().getResource("HSHLZweiteSemster.fxml")));
            liste.add(FXMLLoader.load(getClass().getResource("HSHLDritteSemster.fxml")));
            liste.add(FXMLLoader.load(getClass().getResource("HSHlVierteSemster.fxml")));
            liste.add(FXMLLoader.load(getClass().getResource("HSHlFunfteSemster.fxml")));
            liste.add(FXMLLoader.load(getClass().getResource("HSHlSechsteSemster.fxml")));
            liste.add(FXMLLoader.load(getClass().getResource("HSHlSiebteSemster.fxml")));

            liste.add(FXMLLoader.load(getClass().getResource("AllgErsteSemster.fxml")));
            liste.add(FXMLLoader.load(getClass().getResource("AllgZweiteSemster.fxml")));
            liste.add(FXMLLoader.load(getClass().getResource("AllgDritteSemster.fxml")));
            liste.add(FXMLLoader.load(getClass().getResource("AllgVierteSemster.fxml")));
            liste.add(FXMLLoader.load(getClass().getResource("AllgFunfteSemster.fxml")));
            liste.add(FXMLLoader.load(getClass().getResource("AllgSechsteSemster.fxml")));
            liste.add(FXMLLoader.load(getClass().getResource("AllgSiebteSemster.fxml")));

            liste.add(FXMLLoader.load(getClass().getResource("AstroErsteSemster.fxml")));
            liste.add(FXMLLoader.load(getClass().getResource("AstroZweiteSemster.fxml")));
            liste.add(FXMLLoader.load(getClass().getResource("AstroDritteSemster.fxml")));
            liste.add(FXMLLoader.load(getClass().getResource("AstroVierteSemster.fxml")));
            liste.add(FXMLLoader.load(getClass().getResource("AstroFunfteSemster.fxml")));
            liste.add(FXMLLoader.load(getClass().getResource("AstroSechsteSemster.fxml")));
            liste.add(FXMLLoader.load(getClass().getResource("AstroSiebteSemster.fxml")));


            root.getChildren().add(liste.get(0)); // holt sich die "Start Paine
            Scene scene = new Scene(root);
            primaryStage.setTitle("HSHL-Monopoly"); // Bestimmt den Tietel des Fensters
            primaryStage.setScene(scene); // legt die Scene aufs Fenster
            primaryStage.show();
        } catch (Exception e) {
            e.printStackTrace();
```


----------



## mrBrown (16. Jun 2019)

Eine Exception fliegt vermutlich dort, wo du die Main-Scene lädst. Vergleich mal den Aufruf mit allen folgenden


----------



## Dainka (16. Jun 2019)

```
@Override
    public void start(Stage primaryStage) throws Exception {
        try {
            root = FXMLLoader.load(getClass().getResource("/spiel/FXML.fxml"));          // lädt start Paine

            liste.add(FXMLLoader.load(getClass().getResource("/spiel/Monopoly.fxml")));// hier wird eine Liste mit allen zu ladenen Scenen erstellt
            liste.add(FXMLLoader.load(getClass().getResource("/spiel/AuswahlMenü.fxml")));
            liste.add(FXMLLoader.load(getClass().getResource("/spiel/FigurenMenü.fxml")));
            liste.add(FXMLLoader.load(getClass().getResource("/spiel/AuswahlQuiz.fxml")));

            liste.add(FXMLLoader.load(getClass().getResource("DesignErsteSemster.fxml")));
            liste.add(FXMLLoader.load(getClass().getResource("DesignZweiteSemster.fxml")));
            liste.add(FXMLLoader.load(getClass().getResource("DesignDritteSemster.fxml")));
            liste.add(FXMLLoader.load(getClass().getResource("DesignVierteSemster.fxml")));
            liste.add(FXMLLoader.load(getClass().getResource("DesignFunfteSemster.fxml")));
            liste.add(FXMLLoader.load(getClass().getResource("DesignSechsteSemster.fxml")));
            liste.add(FXMLLoader.load(getClass().getResource("DesignSiebteSemster.fxml")));

            liste.add(FXMLLoader.load(getClass().getResource("InfoErsteSemster.fxml")));
            liste.add(FXMLLoader.load(getClass().getResource("InfoZweiteSemster.fxml")));
            liste.add(FXMLLoader.load(getClass().getResource("InfoDritteSemster.fxml")));
            liste.add(FXMLLoader.load(getClass().getResource("InfoVierteSemster.fxml")));
            liste.add(FXMLLoader.load(getClass().getResource("InfoFunfteSemster.fxml")));
            liste.add(FXMLLoader.load(getClass().getResource("InfoSechsteSemster.fxml")));
            liste.add(FXMLLoader.load(getClass().getResource("InfoSiebteSemster.fxml")));

            liste.add(FXMLLoader.load(getClass().getResource("HSHLErsteSemster.fxml")));
            liste.add(FXMLLoader.load(getClass().getResource("HSHLZweiteSemster.fxml")));
            liste.add(FXMLLoader.load(getClass().getResource("HSHLDritteSemster.fxml")));
            liste.add(FXMLLoader.load(getClass().getResource("HSHlVierteSemster.fxml")));
            liste.add(FXMLLoader.load(getClass().getResource("HSHlFunfteSemster.fxml")));
            liste.add(FXMLLoader.load(getClass().getResource("HSHlSechsteSemster.fxml")));
            liste.add(FXMLLoader.load(getClass().getResource("HSHlSiebteSemster.fxml")));

            liste.add(FXMLLoader.load(getClass().getResource("AllgErsteSemster.fxml")));
            liste.add(FXMLLoader.load(getClass().getResource("AllgZweiteSemster.fxml")));
            liste.add(FXMLLoader.load(getClass().getResource("AllgDritteSemster.fxml")));
            liste.add(FXMLLoader.load(getClass().getResource("AllgVierteSemster.fxml")));
            liste.add(FXMLLoader.load(getClass().getResource("AllgFunfteSemster.fxml")));
            liste.add(FXMLLoader.load(getClass().getResource("AllgSechsteSemster.fxml")));
            liste.add(FXMLLoader.load(getClass().getResource("AllgSiebteSemster.fxml")));

            liste.add(FXMLLoader.load(getClass().getResource("AstroErsteSemster.fxml")));
            liste.add(FXMLLoader.load(getClass().getResource("AstroZweiteSemster.fxml")));
            liste.add(FXMLLoader.load(getClass().getResource("AstroDritteSemster.fxml")));
            liste.add(FXMLLoader.load(getClass().getResource("AstroVierteSemster.fxml")));
            liste.add(FXMLLoader.load(getClass().getResource("AstroFunfteSemster.fxml")));
            liste.add(FXMLLoader.load(getClass().getResource("AstroSechsteSemster.fxml")));
            liste.add(FXMLLoader.load(getClass().getResource("AstroSiebteSemster.fxml")));

            liste.add(FXMLLoader.load(getClass().getResource("ScherzErsteSemster.fxml")));
            liste.add(FXMLLoader.load(getClass().getResource("ScherzZweiteSemster.fxml")));
            liste.add(FXMLLoader.load(getClass().getResource("ScherzDritteSemster.fxml")));
            liste.add(FXMLLoader.load(getClass().getResource("ScherzVierteSemster.fxml")));
            liste.add(FXMLLoader.load(getClass().getResource("ScherzFunfteSemster.fxml")));
            liste.add(FXMLLoader.load(getClass().getResource("ScherzSechsteSemster.fxml")));
            liste.add(FXMLLoader.load(getClass().getResource("ScherzSiebteSemster.fxml")));

            liste.add(FXMLLoader.load(getClass().getResource("TechErsteSemster.fxml")));
            liste.add(FXMLLoader.load(getClass().getResource("TechZweiteSemster.fxml")));
            liste.add(FXMLLoader.load(getClass().getResource("TechDritteSemster.fxml")));
            liste.add(FXMLLoader.load(getClass().getResource("TechVierteSemster.fxml")));
            liste.add(FXMLLoader.load(getClass().getResource("TechFunfteSemster.fxml")));
            liste.add(FXMLLoader.load(getClass().getResource("TechSechsteSemster.fxml")));
            liste.add(FXMLLoader.load(getClass().getResource("TechSiebteSemster.fxml")));


            root.getChildren().add(liste.get(0)); // holt sich die "Start Paine
            Scene scene = new Scene(root);
            primaryStage.setTitle("HSHL-Monopoly"); // Bestimmt den Tietel des Fensters
            primaryStage.setScene(scene); // legt die Scene aufs Fenster
            primaryStage.show();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * +
     * Die Methode soll anhand eines Indexes eine bestimmte Szene aus den Vorhandenen wiedergeben
     *
     * @param index Nummer der Scene
     * @return gibt die Scene zurück die genutzt werden soll
     */
    public static Pane getScene(int index) {

        return liste.get(index);
    }

    /**
     * +
     * Hier wird die aktuelle Scene von der Stage genommen und die gewünschte Scene an Hand des Indexes auf die Stage
     * gelegt und somit aufgerufen
     *
     * @param index
     */
    public static void SetScene(int index) {
        root.getChildren().remove(liste.get(indexcurrent));
        root.getChildren().add(liste.get(index));
        indexcurrent = index;
[LIST=1]
[*]    }
```
[/LIST]


________________________________________________________________________________________________________________________________________

Main Klasse
root = FXMLLoader.load(getClass().getResource("/spiel/FXML.fxml"));     --> Hier soll die Start-Szene geladen werden
________________________________________________________________________________________________________________________________________
@FXML
void handelDesignAction(ActionEvent event){

    if (semster == 1){

        Spiel.SetScene(4);
    }                                                                       --> Hier soll in der InformatikFragen Klasse die jeweilige Szene aufgerufen und                                                                                       draufgelegt werden


----------



## mrBrown (16. Jun 2019)

Gibt es denn jetzt noch ein Problem?


(Ist jede fxml eine Frage?  Das ließe sich deutlich besser lösen...)


----------



## Dainka (16. Jun 2019)

Ja, die Codes zeigen jetzt zwar keinen Fehler mehr an jedoch lässt sich die Main immer noch nicht ausführen, unterbricht und gibt wie folgt den error weiter aus..*

Es soll ein Quiz werden das aus sieben verschiedenen Runden besteht zu je sieben verschieden Kategorien. Aber ja, eine smartere Lösung ist mir nicht eingefallen ...      


*


----------



## mrBrown (17. Jun 2019)

Dainka hat gesagt.:


> Ja, die Codes zeigen jetzt zwar keinen Fehler mehr an jedoch lässt sich die Main immer noch nicht ausführen, unterbricht und gibt wie folgt den error weiter aus..*


Passiert das bei der Ausführung oder beim Kompilieren? 



Dainka hat gesagt.:


> Es soll ein Quiz werden das aus sieben verschiedenen Runden besteht zu je sieben verschieden Kategorien. Aber ja, eine smartere Lösung ist mir nicht eingefallen ...


Eine Fxml, in der die GUI beschreiben ist (ein Text mit frage, mehrere Antwort-Buttons, ...), und die aktuelle Frage jeweils über den Controller zuweisen. Du musst keineswegs alle Texte hardcoded in der FXML angeben.


----------



## Dainka (17. Jun 2019)

mrBrown hat gesagt.:


> Passiert das bei der Ausführung oder beim Kompilieren?
> 
> 
> Eine Fxml, in der die GUI beschreiben ist (ein Text mit frage, mehrere Antwort-Buttons, ...), und die aktuelle Frage jeweils über den Controller zuweisen. Du musst keineswegs alle Texte hardcoded in der FXML angeben.




- Es passiert beim Ausführen.
- Habe es jetzt so lösen wollen dass ich einen AuswahlQuizController habe, der dann über den SetScene die jeweilige FXML aufruft, dann die Choicebox einem antwortet und das Label die Frage zugeordnet kriegt.
- Über den NextButtun soll wieder alles geschlossen und die bereits erreichten Punkte gespeichert werden.


----------



## mrBrown (17. Jun 2019)

Dainka hat gesagt.:


> - Es passiert beim Ausführen.


Dann sollte irgendwo auch eine Exception mit StackTrace auftauchen - damit findet man dann den Fehler.



Dainka hat gesagt.:


> - Habe es jetzt so lösen wollen dass ich einen AuswahlQuizController habe, der dann über den SetScene die jeweilige FXML aufruft, dann die Choicebox einem antwortet und das Label die Frage zugeordnet kriegt.
> - Über den NextButtun soll wieder alles geschlossen und die bereits erreichten Punkte gespeichert werden.


Aber das ist doch super umständlich, weil du jetzt 279517 FXML-Dateien hast, die sich jeweils nur in einem Text unterscheiden


----------



## Dainka (17. Jun 2019)

Danke, ich werde versuchen durch das StackTrace den Fehler zu finden..

Und zu den FXML-Dateien fällt mir leider keine einfachere Bzw. keine smartere Lösung ein.
Zufällig welche Vorschläge?
(Eine die das vereinfacht und trotzdem die Funktion mit dem zuordnen von Antwort zu frage beibehält?)


----------



## mrBrown (17. Jun 2019)

Dainka hat gesagt.:


> Danke, ich werde versuchen durch das StackTrace den Fehler zu finden..


Du kannst den Stacktrace auch hier zeigen, dann kann man dir helfen 



Dainka hat gesagt.:


> Und zu den FXML-Dateien fällt mir leider keine einfachere Bzw. keine smartere Lösung ein.
> Zufällig welche Vorschläge?
> (Eine die das vereinfacht und trotzdem die Funktion mit dem zuordnen von Antwort zu frage beibehält?)


Oben schon geschrieben:



mrBrown hat gesagt.:


> Eine Fxml, in der die GUI beschreiben ist (ein Text mit frage, mehrere Antwort-Buttons, ...), und die aktuelle Frage jeweils über den Controller zuweisen. Du musst keineswegs alle Texte hardcoded in der FXML angeben.



Für die Fragen kannst du einfach eine Liste von Fragen zu nutzen, wobei Fragen dann eine passende Klasse ist, die die Frage und die Antwortmöglichkeiten enthält.


----------



## Dainka (17. Jun 2019)

mrBrown hat gesagt.:


> Du kannst den Stacktrace auch hier zeigen, dann kann man dir helfen
> 
> 
> Oben schon geschrieben:
> ...




Okay, verstehen tu ich bislang alles.
Jetzt fehlt mir nur noch ein guter Ansatz zur Umsetzung des ganzen..
Zufällig eine Idee?

Und vielen Dank schonmal für die Geduld und die ganzen guten Vorschläge!!


----------



## mrBrown (17. Jun 2019)

Dainka hat gesagt.:


> Okay, verstehen tu ich bislang alles.
> Jetzt fehlt mir nur noch ein guter Ansatz zur Umsetzung des ganzen..
> Zufällig eine Idee?


Na der Ansatz steht doch schon da 

Du brauchst eine Klasse "Frage". In einer Liste speicherst du dann X fragen.
Dann brauchst du eine FXML, die eine Frage darstellt, also Text für den Fragetext + Checkbox/Button/Whatever für die Antworten. Zu der FXml gehört ein Controller, dieser zeigt die jeweils aktuelle Frage an, wertet die Antwort aus, zeigt dann die nächste Frage an usw.


----------



## Dainka (18. Jun 2019)

mrBrown hat gesagt.:


> Na der Ansatz steht doch schon da
> 
> Du brauchst eine Klasse "Frage". In einer Liste speicherst du dann X fragen.
> Dann brauchst du eine FXML, die eine Frage darstellt, also Text für den Fragetext + Checkbox/Button/Whatever für die Antworten. Zu der FXml gehört ein Controller, dieser zeigt die jeweils aktuelle Frage an, wertet die Antwort aus, zeigt dann die nächste Frage an usw.



Habe es soweit ausprobiert. Jedoch treten noch Probleme auf wenn ich bei de Fragen-/Antwortklasse eine ArrayList definiere..
Ich weiß nicht wie ich mir die im FXML.Controller für die Fragen anzeigen lassen kann..

Könnte man das so nutzen um dem ausgewählten eintrag der choicebox mit meiner "Lösung" zu vergleichen?*

*

```
@FXML
public void NextButtonPushed (ActionEvent event){
    //Spiel.SetScene(2);choBoxAddLR.getSelectionModel().getSelectedItem()

    if (antworteins.getSelectionModel().getSelectedItem().equals("dass Erdnussbutteram Gaumen klebt")){
        punkte++;
        if (!"dass Erdnussbutteram Gaumen klebt".equals(antworteins.getSelectionModel().getSelectedItem())) {
            punkte--;

        } else if (antworteins.getSelectionModel().getSelectedItem().isEmpty()) {
            punkte--;

        }
    }

}
```


----------



## mrBrown (18. Jun 2019)

Mal anders gefragt: Könntest du so ein Quiz rein mit Kommandozeilen-Bedienung umsetzen?

Bevor du mit GUI anfängst, solltest du die Grundlagen drauf haben, und wenn ich mir das Code-Stück so angucke, fehlt da noch ein bisschen zu...


----------



## Dainka (18. Jun 2019)

Tatsächlich habe ich mich vor 2/3 schon einmal ziemlich intensiv mit Java in der beschäftigt. Damals habe ich auch schon GUI mit swing programmiert in Bluej. Was zwar deutlich umständlicher ist aber mir persönlich viel einfacher fiel. Da dies aber mehr als veraltet ist und auch nicht mehr wirklich verwendet werden, wage ich mich jetzt an Java FXML. Da sich der GUI mit JavaFxml einfach über Scene Builder 2.0 per Drag und Drog erstellen lässt.

Das Programm über Kommandozeilen-Bedienung wäre glaub ich nicht das Problem würde es dann einfach in einer Klasse schreiben. Die Werte mit system.out.println ausgeben lassen und über einen String eingabe und antwort vergleichen.

Mein riesiges Problem ist das umdenken... Stehe echt aufm Schlauch

Meine Java Klasse Kategorie - hier sollen die Fragen und Antworten zu dem jeweiligen Thema gespeicher werden

```
package spiel;

import java.util.ArrayList;

public class Kategorien {

    public static ArrayList<String> fragenInformatik = new ArrayList<>();
    public static ArrayList<String> antwortenInformatik = new ArrayList<>();


    public static void getInformatik(){

        fragenInformatik.add(1,"");
        fragenInformatik.add(6,"");
        fragenInformatik.add(11,"");


        antwortenInformatik.add(2,"g");
        antwortenInformatik.add(3,"g");
        antwortenInformatik.add(4,"g");
        antwortenInformatik.add(5,"g");

        antwortenInformatik.add(7,"g");
        antwortenInformatik.add(8,"g");
        antwortenInformatik.add(9,"g");
        antwortenInformatik.add(10,"g");

        antwortenInformatik.add(12,"g");
        antwortenInformatik.add(13,"g");
        antwortenInformatik.add(14,"g");
        antwortenInformatik.add(15,"g");

    }

    public static ArrayList<String> fragenTechnik = new ArrayList<>();
    public static ArrayList<String> antwortenTechnik = new ArrayList<>();

    public static void getTechnik(){

        fragenTechnik.add(16,"");
        fragenTechnik.add(21,"");
        fragenTechnik.add(26,"");

        antwortenTechnik.add(17,"");
        antwortenTechnik.add(18,"");
        antwortenTechnik.add(19,"");
        antwortenTechnik.add(20,"");

        antwortenTechnik.add(22,"");
        antwortenTechnik.add(23,"");
        antwortenTechnik.add(24,"");
        antwortenTechnik.add(25,"");

        antwortenTechnik.add(27,"");
        antwortenTechnik.add(28,"");
        antwortenTechnik.add(29,"");
        antwortenTechnik.add(30,"");
    }
    public static ArrayList<String> fragenHshl = new ArrayList<>();
    public static ArrayList<String> antwortenHshl = new ArrayList<>();

    public static void getHshl(){

        fragenHshl.add(31,"");
        fragenHshl.add(36,"");
        fragenHshl.add(41,"");

        antwortenHshl.add(32,"");
        antwortenHshl.add(33,"");
        antwortenHshl.add(34,"");
        antwortenHshl.add(35,"");

        antwortenHshl.add(37,"");
        antwortenHshl.add(38,"");
        antwortenHshl.add(39,"");
        antwortenHshl.add(40,"");

        antwortenHshl.add(42,"");
        antwortenHshl.add(43,"");
        antwortenHshl.add(44,"");
        antwortenHshl.add(45,"");
    }

    public static ArrayList<String> fragenDesign = new ArrayList<>();
    public static ArrayList<String> antwortenDesign = new ArrayList<>();


    public static void getDesign(){

        fragenDesign.add(46,"");
        fragenDesign.add(51,"");
        fragenDesign.add(56,"");

        antwortenDesign.add(47,"");
        antwortenDesign.add(48,"");
        antwortenDesign.add(49,"");
        antwortenDesign.add(50,"");

        antwortenDesign.add(52,"");
        antwortenDesign.add(53,"");
        antwortenDesign.add(54,"");
        antwortenDesign.add(55,"");

        antwortenDesign.add(57,"");
        antwortenDesign.add(58,"");
        antwortenDesign.add(59,"");
        antwortenDesign.add(60,"");

    }

    public static ArrayList<String> fragenAllg = new ArrayList<>();
    public static ArrayList<String> antwortenAllg = new ArrayList<>();

    public static void getAllg(){

        fragenAllg.add(61,"");
        fragenAllg.add(66,"");
        fragenAllg.add(71,"");

        antwortenAllg.add(62,"");
        antwortenAllg.add(63,"");
        antwortenAllg.add(64,"");
        antwortenAllg.add(65,"");

        antwortenAllg.add(67,"");
        antwortenAllg.add(68,"");
        antwortenAllg.add(69,"");
        antwortenAllg.add(70,"");

        antwortenAllg.add(72,"");
        antwortenAllg.add(73,"");
        antwortenAllg.add(74,"");
        antwortenAllg.add(75,"");
    }

    public static ArrayList<String> fragenScherz = new ArrayList<>();
    public static ArrayList<String> antwortenScherz = new ArrayList<>();

    public static void getScherz(){

        fragenScherz.add(76,"");
        fragenScherz.add(81,"");
        fragenScherz.add(86,"");

        antwortenScherz.add(77,"");
        antwortenScherz.add(78,"");
        antwortenScherz.add(79,"");
        antwortenScherz.add(80,"");

        antwortenScherz.add(82,"");
        antwortenScherz.add(83,"");
        antwortenScherz.add(84,"");
        antwortenScherz.add(85,"");

        antwortenScherz.add(87,"");
        antwortenScherz.add(88,"");
        antwortenScherz.add(89,"");
        antwortenScherz.add(90,"");
    }

    public static ArrayList<String> fragenAstro = new ArrayList<>();
    public static ArrayList<String> antwortenAstro = new ArrayList<>();

    public static void getAstro(){

        fragenAstro.add(91,"");
        fragenAstro.add(96,"");
        fragenAstro.add(101,"");

        antwortenAstro.add(92,"");
        antwortenAstro.add(93,"");
        antwortenAstro.add(94,"");
        antwortenAstro.add(95,"");

        antwortenAstro.add(97,"");
        antwortenAstro.add(98,"");
        antwortenAstro.add(99,"");
        antwortenAstro.add(100,"");

        antwortenAstro.add(102,"");
        antwortenAstro.add(103,"");
        antwortenAstro.add(104,"");
        antwortenAstro.add(105,"");

    }


}
```



Hier mein TechnikController für mein Technik.fxml ,hier soll das Label und die Choicebox mit den jeweiligen werten gefüllt und angezeigt werden. Aber da hakt es bei mir leider ...


```
package spiel;

import java.net.URL;
import java.util.ResourceBundle;

import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.control.ChoiceBox;
import javafx.scene.control.Label;
import javafx.scene.layout.AnchorPane;

public class TechnikController {

    @FXML
    private ResourceBundle resources;

    @FXML
    private URL location;

    @FXML
    private Label textFrage;

    @FXML
    private AnchorPane PaneTechnik;

    @FXML
    private Button weiter,prüfen;

    @FXML
    private ChoiceBox<String> textAntwort;

    public static int punkte;

    @FXML
    void handelWeiterAction(ActionEvent event) {



    }

    @FXML
    void handelPrüfenAction(ActionEvent event) {



    }

    @FXML
    void initialize() {
        assert textFrage != null : "fx:id=\"textFrage\" was not injected: check your FXML file 'Technik.fxml'.";
        assert PaneTechnik != null : "fx:id=\"PaneTechnik\" was not injected: check your FXML file 'Technik.fxml'.";
        assert weiter != null : "fx:id=\"weiter\" was not injected: check your FXML file 'Technik.fxml'.";
        assert prüfen != null : "fx:id=\"prüfen\" was not injected: check your FXML file 'Technik.fxml'.";
        assert textAntwort != null : "fx:id=\"textAntwort\" was not injected: check your FXML file 'Technik.fxml'.";

    }
}


    @FXML
    void handelPrüfenAction(ActionEvent event) {



    }

    @FXML
    void initialize() {
        assert textFrage != null : "fx:id=\"textFrage\" was not injected: check your FXML file 'Technik.fxml'.";
        assert PaneTechnik != null : "fx:id=\"PaneTechnik\" was not injected: check your FXML file 'Technik.fxml'.";
        assert weiter != null : "fx:id=\"weiter\" was not injected: check your FXML file 'Technik.fxml'.";
        assert prüfen != null : "fx:id=\"prüfen\" was not injected: check your FXML file 'Technik.fxml'.";
        assert textAntwort != null : "fx:id=\"textAntwort\" was not injected: check your FXML file 'Technik.fxml'.";

    }
}
```


----------



## mrBrown (18. Jun 2019)

Für den Anfang solltest du dir mal über sinnvolle Klassen Gedanken machen, deine Kategorien-Klasse ist so ziemlich die schlechteste Umsetzung, die man sich dafür überlegen könnte...

Als erstes könntest du dir überlegen, welche Klassen es geben müsste, um das Problem abzubilden. zB Quiz, Frage, Antwort, ...


----------



## Dainka (18. Jun 2019)

mrBrown hat gesagt.:


> Für den Anfang solltest du dir mal über sinnvolle Klassen Gedanken machen, deine Kategorien-Klasse ist so ziemlich die schlechteste Umsetzung, die man sich dafür überlegen könnte...
> 
> Als erstes könntest du dir überlegen, welche Klassen es geben müsste, um das Problem abzubilden. zB Quiz, Frage, Antwort, ...




Ok, ja wie gesagtbei mir hakts mit der Umsetzung bzw damit den besten und einfachsten Weg zu finden um mein Problem zu lösen.Wenn ich es deinen Aussagen entnehme wäre es also sinnvoller für Fragen und Antworten eine eigen Klasse zu schreiben.

Diesen Ansatz habe ich jetzt auch verfolgt und für Frage, Antwort und KarteController(Quizkarte) eine eigene Klasse erstellt. Die Karte ist eine fxml mit Button,  Label und Checkbox. Ich habe in den Klassen Fragen und Antworten jeweils eine ArrayList erstellt, habe ihnen ein Index und einen String zu gewiesen.

Nun muss ich schauen wie ich die Werte aus den ArrayLists in das Label und in die ChoiceBox kriege.

Danke für den kleinen Denkanstoß !


----------



## mrBrown (18. Jun 2019)

Dainka hat gesagt.:


> Ich habe in den Klassen Fragen und Antworten jeweils eine ArrayList erstellt, habe ihnen ein Index und einen String zu gewiesen.


Das klingt beim ersten Lesen falsch, magst du die beiden Klassen mal zeigen?


----------



## Dainka (19. Jun 2019)

mrBrown hat gesagt.:


> Das klingt beim ersten Lesen falsch, magst du die beiden Klassen mal zeigen?



Hier meine Fragen Klasse

```
package spiel;

import javafx.scene.control.Label;

import java.util.ArrayList;


public class Fragen {

    public static ArrayList<String> fragen = new ArrayList<>();

    public static void Fragen(Label fr){

        fragen.add("Na du");

        fragen.add(1,"");
        fragen.add(2,"g");
        fragen.add(3,"g");
        fragen.add(4,"g");

        fragen.add(5,"g");
        fragen.add(6,"");
        fragen.add(7,"g");
        fragen.add(8,"g");

        fragen.add(9,"g");
        fragen.add(10,"g");
        fragen.add(11,"");
        fragen.add(12,"g");

        fragen.add(13,"g");
        fragen.add(14,"g");
        fragen.add(15,"g");
        fragen.add(16,"");

    }

}
```


Hier meine Antwort Klasse


```
package spiel;

import java.util.ArrayList;

public class Antworten {

    static ArrayList<String> antworten = new ArrayList<>();

            antworten.add("Hallo");

            antworten.add(1,"g");
            antworten.add(2,"g");
            antworten.add(3,"g");
            antworten.add(4,"g");

            antworten.add(5,"g");
            antworten.add(6,"g");
            antworten.add(7,"g");
            antworten.add(8,"g");

            antworten.add(9,"g");
            antworten.add(10,"g");
            antworten.add(11,"");
            antworten.add(12,"g");

            antworten.add(13,"g");
            antworten.add(14,"g");
            antworten.add(15,"g");
            antworten.add(16,"g");

        }

    }
```


Und zu guter letzt meine KartenController Klasse



```
package spiel;

import java.net.URL;
import java.util.ResourceBundle;

import javafx.application.Application;
import javafx.beans.Observable;
import javafx.collections.FXCollections;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.scene.Parent;
import javafx.scene.control.Button;
import javafx.scene.control.ChoiceBox;
import javafx.scene.control.Label;
import javafx.scene.control.Tooltip;
import javafx.stage.Stage;

import java.util.ArrayList;
import java.util.Set;

public class KarteController implements Initializable {

    @FXML
    public ResourceBundle resources;

    @FXML
    public URL location;

    @FXML
    private Label frage;

    @FXML
    private Button weiter;

    @FXML
    private ChoiceBox<String> antwort;

    public int rundenAnzahl=0;

    public static int semster;



    @FXML
    void onWeiterAction(ActionEvent event) {

      
    public void setAntwort(ChoiceBox<?> antwort) {


        //this.antwort = antwort;
    }

    @Override
    public void initialize(URL location, ResourceBundle resources) {
    
            frage.setText();
            Antworten.getItems().addAll();
    }
}

    @Override
    public void initialize(URL url, ResourceBundle resourceBundle) {

    }
}
```

und hier die FXML zur Karte



```
<?xml version="1.0" encoding="UTF-8"?>

<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>


<fx:root prefHeight="400.0" prefWidth="600.0" type="AnchorPane" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="spiel.KarteController">
   <children>
      <Button fx:id="weiter" layoutX="508.0" layoutY="347.0" mnemonicParsing="false" onAction="#onWeiterAction" text="Button" />
      <Label fx:id="frage" layoutX="11.0" layoutY="72.0" prefHeight="118.0" prefWidth="579.0" text="Label" />
      <ChoiceBox fx:id="antwort" layoutX="10.0" layoutY="200.0" prefHeight="39.0" prefWidth="579.0" />
   </children>
</fx:root>
```


----------



## Dainka (19. Jun 2019)

mrBrown hat gesagt.:


> Das klingt beim ersten Lesen falsch, magst du die beiden Klassen mal zeigen?



Ich habe echt Probleme beim Umdenken und initizalisieren des Label und der ChoicBox, ich weiß nicht genau wie das anstellen kann das er den Text aus den ArrayLists nimmt und als String in Label und ChoiceBox zurückgibt...  da fehlen mir echt die erfahrungen im Umgang mit FXML.


----------



## Robat (19. Jun 2019)

Du solltest dich generell erstmal mit den Grundlagen von Java beschäftigen. 
static Variablen sind am Anfang ein NoGo und brauchst du in 99% der Fälle auch nicht. 
Du deklarierst momentan Methoden in anderen Methoden - da sollte deine IDE eigentlich explodieren.


----------

