JavaFX mit JDK 12

Diskutiere JavaFX mit JDK 12 im Allgemeine Java-Themen Bereich.
Bitte aktiviere JavaScript!
D

Dainka

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:


Java:
"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..
 
Zuletzt bearbeitet von einem Moderator:
M

mrBrown

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.

Wenn du nur das Package "spiel" hast, müsste die grob so aussehen:
Java:
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.

Eine zusätzliche Main-Klasse mit main-Methode:
Java:
public class Main {
    public static void main(String[] args) {
        Spiel.main(args);
    }
}
Die Application, ergänzt um eine explizite main-Methode:
Java:
public class Spiel extends Application {
    public static void main(String[] args) {
        Application.launch(args);
    }

   //der Rest aus der Klasse
}
 
D

Dainka

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

mrBrown

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

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

Dainka

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

mrBrown

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

Dainka

Code bitte in Code-Tags ([CODE=java]//code[/CODE]) und nicht als Screenshot Posten.
Java:
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();
 
M

mrBrown

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

Dainka

Java:
    @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
 
M

mrBrown

Gibt es denn jetzt noch ein Problem?


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

Dainka

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


*
12090
 
M

mrBrown

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?

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.
 
D

Dainka

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.
 
M

mrBrown

- Es passiert beim Ausführen.
Dann sollte irgendwo auch eine Exception mit StackTrace auftauchen - damit findet man dann den Fehler.

- 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 ;)
 
D

Dainka

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?)
 
M

mrBrown

Danke, ich werde versuchen durch das StackTrace den Fehler zu finden..
Du kannst den Stacktrace auch hier zeigen, dann kann man dir helfen ;)

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:

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.
 
D

Dainka

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


Oben schon geschrieben:



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.

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!! :)
 
M

mrBrown

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.
 
D

Dainka

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?*

*
Javascript:
@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--;

        }
    }

}
 
M

mrBrown

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...
 
D

Dainka

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
Java:
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 ...

Java:
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'.";

    }
}
 
M

mrBrown

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, ...
 
D

Dainka

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ß !
 
D

Dainka

Das klingt beim ersten Lesen falsch, magst du die beiden Klassen mal zeigen?
Hier meine Fragen Klasse
Java:
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

Java:
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


Java:
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:
<?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>
 
D

Dainka

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

Robat

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.
 
Thema: 

JavaFX mit JDK 12

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben