Nach dem Herüberschieben eines Arrays zwischen 2 Frames öffnet sich das Frame nicht mehr

In meiner Klasse habe ich ein Array erstellt und habe dieses anschließend auf ein JFrame übertragen, damit ich dort auf das Array zugreifen kann.

public NewJFrame(String[][][] c){
a = c;
initComponents();
}

Das JFrame habe ich dann unten sichtbar gesetzt.

public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
new NewJFrame().setVisible(true);
}
});
}

Als das Fenster sich daraufhin nicht öffnete, habe ich herausgefunden, dass ich noch einmal extra

public NewJFrame() {
initComponents();

schreiben muss. Daraufhin klappte es für eine kurze Zeit, bis ich dem Frame ein neues Design gab (Bild ganz unten). Nun öffnet sich das Frame nicht und ich bekomme diese Fehlermeldung:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at javax.swing.ImageIcon.<init>(ImageIcon.java:217)
at quiz.NewJFrame.initComponents(NewJFrame.java:120)
at quiz.NewJFrame.<init>(NewJFrame.java:20)
at quiz.NewJFrame$5.run(NewJFrame.java:186)

Zeile 20 ist die Zeile mit initComponents(); unter public NewJFrame().
Zeile 186 ist die Zeile, wo ich das Fenster auf sichtbar stelle.
Zeile 120 ist ein Fehler im vorgeschriebenen Code (Generated Code):

jLabel1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/quiz/question-mark-background-vector.jpg"))); // NOI18N

Ich weiß gerade gar nicht, wo der Fehler liegt...
Ich würde mich über schnelle Hilfe freuen.
Schonmal danke

Johannes

PS: Das Programm ist für ein Quiz, welches ich als Schulprojekt machen muss.

upload_2018-2-19_17-4-45.png
 
Es wird offenbar eine NullPointerException geschmissen. Irgendetwas, auf das du zuzugreifen versuchst, ist nicht initialisiert. Womöglich jLabel1 ... aber da müsstest du einfach mal debuggen und nachschauen.

Die beiden Konstruktoren deiner Klasse, die du hier gepostet hast, sehen nach einem weiteren Problem aus, aber das ist nur geraten. In dem JFrame, den du in deiner Main-Methode anlegst, wird a nicht initialisiert. Ob das später nachgeholt wird oder ob es überhaupt ein Problem darstellt, ist hier aber nicht ersichtlich.
 
Vielen Dank!
Es hat jetzt geklappt 🙂.
Allerdings habe ich jetzt ein neues Problem und zwar habe ich in dem Array ja pro Spalte 5 Zeilen, wo die Frage, 3 Antwortmöglichkeiten und die richtige Antwort stehen. Bsp.:

matrix[0][0][0] = "Wie schnell schaffte Usain Bolt den 100-Meter Sprint?";
matrix[1][0][0] = "<a> 9,58 Sekunden";
matrix[2][0][0] = "<b> 11,63 Sekunden";
matrix[3][0][0] = "<c> 7,45 Sekunden";
matrix[4][0][0] = "a";

Meine Frage ist, wie ich es hinbekomme die Frage zum Beispiel in einem Textfeld auszugeben, wobei die Frage immer überschrieben werden muss von einer Neuen, wenn ich einen Button drücke. Die Antworten kommen dann in jeweils einen Radio Button.
Könntet ihr mir da vielleicht auch nochmal helfen... Das wäre echt sehr, sehr nett 🙂 Stehe gerade irgendiwe komplett auf dem Schlauch, da ich, obwohl ich in einer 4er Gruppe bin, das Programm alleine schreiben darf...

Schonmal vielen Dank

Johannes
 
Moin,
matrix[0][0][0] = "Wie schnell schaffte Usain Bolt den 100-Meter Sprint?";
matrix[1][0][0] = "<a> 9,58 Sekunden";
matrix[2][0][0] = "<b> 11,63 Sekunden";
matrix[3][0][0] = "<c> 7,45 Sekunden";
matrix[4][0][0] = "a";
mal ganz dumm gefragt: warum ist das Array dreidimensional???
Füllst Du noch anderswo??
Sonst macht es nun gar keinen Sinn !!

VG Klaus
 
Ja ich habe 2 Schwierigkeitsstufen die ich auf dem Startbildschirm bestimmen lassen (siehe Bild oben). Deshalb brauche ich auch ein dreidimensionales Array...
Sorry, hatte ich vergessen zu erwähnen xD.
 
Vielen Dank!
Es hat jetzt geklappt 🙂.
Allerdings habe ich jetzt ein neues Problem und zwar habe ich in dem Array ja pro Spalte 5 Zeilen, wo die Frage, 3 Antwortmöglichkeiten und die richtige Antwort stehen. Bsp.:

matrix[0][0][0] = "Wie schnell schaffte Usain Bolt den 100-Meter Sprint?";
matrix[1][0][0] = "<a> 9,58 Sekunden";
matrix[2][0][0] = "<b> 11,63 Sekunden";
matrix[3][0][0] = "<c> 7,45 Sekunden";
matrix[4][0][0] = "a";

Meine Frage ist, wie ich es hinbekomme die Frage zum Beispiel in einem Textfeld auszugeben, wobei die Frage immer überschrieben werden muss von einer Neuen, wenn ich einen Button drücke. Die Antworten kommen dann in jeweils einen Radio Button.
Könntet ihr mir da vielleicht auch nochmal helfen... Das wäre echt sehr, sehr nett 🙂 Stehe gerade irgendiwe komplett auf dem Schlauch, da ich, obwohl ich in einer 4er Gruppe bin, das Programm alleine schreiben darf...

Schonmal vielen Dank

Johannes

Naja du könntest nach dem drücken des Button den Componenten auf einem Panel immer neue Werte übergeben und dann repaint benutzen, oder du kannst mit RemoveAll auf dem Panel alle Componenten löschen und mit anderen Werten wieder anzeigen lassen. Es gibt echt viele Möglichkeiten das Umzusetzen 🙂
 
Das ganze ordentlich in ein Objekt zu wrappen würde die ganze Sache vereinfachen 😉

Wie meinst du das? Sorry, dass ich gerade so gar keinen Plan habe. xD Könntet ihr mir das vielleicht direkt ausführlich erklären. Am besten ihr denkt euch einfach, dass ihr irgendjemandem, der das gerade zum ersten Mal macht, das erklären müsst und erklärt es mir dann am besten so. xD Ansonsten ist die Wahrscheinlichkeit sehr hoch, dass ich es nicht verstehen werde...

Aber trotzdem dankeschön für die bisherigen Antworten und schonmal danke für die folgenden.

LG Johannes
 
Ich meine damit dass du daraus wunderbar ein Objekt machen kannst welches die nötigen Attribute besitzt.
In deinem Fall wäre das Objekt bspw. Exercise (oder Task, Aufgabe, .. wie auch immer) mit den Attributen question:String, answers:String[], difficulty:int und correctAnswerIndex:int.
(ob man von der richtigen Antwort nun den Index abspeichert oder nicht kann man sich drüber streiten - genauso über die Bennung).
Somit hättest du eine vollwertige Klasse
Java:
public class Task {
     private String question;
     private String[] answers;
     private int difficulty;
     private int correctAnswerIndex;
 
     // Constructor (questions, answers, difficulty, correctAnswerIndex)
     // Getter / Setter
     // getQuestion() : String
     // ..
}

Nun kannst du - anstatt ein 3d-Array zu nehmen - ein simples Array (oder eine Liste?) anlegen vom Typ Task.
Java:
public static void main(String[] args) {
    List<Task> taskList = new ArrayList<>();
    // oder bspw: Task[] taskArray = new Task[20];
    taskList.add(new Task("Was ist die Beste Programmiersprache?", new String[]{"Java", "C", "Ruby"}, 1, 0));
}

Das mit dem Anzeigen lassen ist somit auch kein wirkliches Problem mehr.
  1. Du holst dir einfach die nächste Frage die dran ist (entweder lässt du einen Zähler mitlaufen oder lässt zufällig einen Index bestimmen)
  2. Überschreibst den Text vom Textfeld mit der neuen Frage textfeld.setText(currentTask.getQuestion());
  3. Änderst den Text der 3 Radio-Buttons ( Hol dir die 3 Antwortmöglichkeiten von aktuellen Task über die Getter-Methode)

Zusätzlich müsstest du dir dann noch abspeichern welches Objekt (also welche Frage) gerade "dran" ist um bei der Überprüfung der Antwort leichteres Spiel zu haben. Dazu reicht eine globale Variable (entweder einen int um den Index zu speichern oder direkt ein Task-Objekt).

Außerdem könnte man die difficulty noch in ein Enum auslagern und und und. Aber eins nach dem anderen.
 
Ich meine damit dass du daraus wunderbar ein Objekt machen kannst welches die nötigen Attribute besitzt.
In deinem Fall wäre das Objekt bspw. Exercise (oder Task, Aufgabe, .. wie auch immer) mit den Attributen question:String, answers:String[], difficulty:int und correctAnswerIndex:int.
(ob man von der richtigen Antwort nun den Index abspeichert oder nicht kann man sich drüber streiten - genauso über die Bennung).
Somit hättest du eine vollwertige Klasse
Java:
public class Task {
     private String question;
     private String[] answers;
     private int difficulty;
     private int correctAnswerIndex;
 
     // Constructor (questions, answers, difficulty, correctAnswerIndex)
     // Getter / Setter
     // getQuestion() : String
     // ..
}

Nun kannst du - anstatt ein 3d-Array zu nehmen - ein simples Array (oder eine Liste?) anlegen vom Typ Task.
Java:
public static void main(String[] args) {
    List<Task> taskList = new ArrayList<>();
    // oder bspw: Task[] taskArray = new Task[20];
    taskList.add(new Task("Was ist die Beste Programmiersprache?", new String[]{"Java", "C", "Ruby"}, 1, 0));
}

Das mit dem Anzeigen lassen ist somit auch kein wirkliches Problem mehr.
  1. Du holst dir einfach die nächste Frage die dran ist (entweder lässt du einen Zähler mitlaufen oder lässt zufällig einen Index bestimmen)
  2. Überschreibst den Text vom Textfeld mit der neuen Frage textfeld.setText(currentTask.getQuestion());
  3. Änderst den Text der 3 Radio-Buttons ( Hol dir die 3 Antwortmöglichkeiten von aktuellen Task über die Getter-Methode)

Zusätzlich müsstest du dir dann noch abspeichern welches Objekt (also welche Frage) gerade "dran" ist um bei der Überprüfung der Antwort leichteres Spiel zu haben. Dazu reicht eine globale Variable (entweder einen int um den Index zu speichern oder direkt ein Task-Objekt).

Außerdem könnte man die difficulty noch in ein Enum auslagern und und und. Aber eins nach dem anderen.

Oha vielen, vielen Dank🙂 ich probiere das gleich mal aus und melde mich dann nochmal🙂. Aber trotzdem schonmal vielen Dank für die Mühe.
 
Mein Lehrer hat mir das nochmal erklärt mit dem Array, da er meinte, ich sollte das verwenden... Jetzt habe ich fast alles geschafft, nur noch eine Kleinigkeit fehlt...

Und hier kommt erneut mein Problem:
Mittlerweile klappt alles, auch das einlesen der Frage, allerdings bekomme ich es nicht hin, durch einen Klick auf den Button die Frage zu wechseln. Ich dachte, bei einem dreidimensionalen Array brauche ich auch 3 for-Schleifen also so:

Java:
for(int i = rndFragenZahl;i<=fragenProRunde;){
            for(int j = schwierigkeit;j<1;){
                for(int k = 0;k<1;){
                   frage.setText(fragen[k][i][j]);
                   antwort1.setText(fragen[k+1][i][j]);
                   antwort2.setText(fragen[k+2][i][j]);
                   antwort3.setText(fragen[k+3][i][j]);
                   fragenProRunde++;
                }
            }
        }

Allerdings wusste ich zuerst nichts mit den beiden Variablen j und k anzufangen und hab die deshalb so eingestellt, da die halt eigentlich unnötig sind. Trotzdem funktioniert es wieder nicht...
Die Variable fragenProRunde ist eine int Variable und soweit mit, dass nur 10 Fragen kommen, damit ich danach den Endbildschirm auswerfen kann und die Variable rndFragenZahlen soll mir einfach eine random Zahl also schließlich eine random Frage auswerfen, da ich ja nicht immer nur die gleichen Fragen möchte🙂.

Könntet ihr mir diesmal erneut behilflich sein...

Liebe Grüße Johannes

PS: Wenn ihr gerade dabei seid...
Ich muss ja noch auf meiner letzten Zeile im Array auslesen, ob die Antwort richtig ist, was auch klappt, allerdings wirft er mir, wenn ich zum Beispiel zwischen den Radio Buttons wechsel, ohne auf Weiter zu drücken, den Text aus, ob die Frage richtig oder falsch beantwortet wurde von allen Radio Buttons, die bis dahin kurz ausgewählt waren xD. Richtig und praktisch ist das ja nicht und vielleicht könntet ihr mir auch da weiterhelfen...

Schonmal vielen lieben Dank🙂
 
Zuletzt bearbeitet von einem Moderator:
Bitte Code in Code-Tags setzen: [code=java]//JAVA CODE HERE[/code]

Sorry wird nicht wieder passieren😉. Wusste nur bis gerade nicht, wie das geht...

Davon abgesehen, wäre es nett, wenn mir jemand meine Frage beantworten könnte😀. Allerdings hat sich die erste Frage bereits erledigt und das, was ich unter PS geschrieben habe ist, muss ich allerdings immer noch wissen...

Hier nochmal mein bisheriger Code dafür... hoffentlich richtig geschrieben...xD
Java:
private void buttonActionPerformed(java.awt.event.ActionEvent evt) {                                       
        if("a".equals(fragen[4][fragennummer][schwierigkeit])){
            if(Antwort1 == true){
                JOptionPane.showMessageDialog(null, "Richtig; mach weiter so :)");
            }
            if(Antwort2 == true){
                JOptionPane.showMessageDialog(null, "Leider falsch :). Richtig wäre Antwort a");
            }
            if(Antwort3 == true){
                JOptionPane.showMessageDialog(null, "Leider falsch :). Richtig wäre Antwort a");
            }
        }
        if("b".equals(fragen[4][fragennummer][schwierigkeit])){
            if(Antwort2 == true){
                JOptionPane.showMessageDialog(null, "Richtig; mach weiter so :)");
            }
            if(Antwort1 == true){
                JOptionPane.showMessageDialog(null, "Leider falsch :). Richtig wäre Antwort b");
            }
            if(Antwort3 == true){
                JOptionPane.showMessageDialog(null, "Leider falsch :). Richtig wäre Antwort b");
            }
        }
        if("c".equals(fragen[4][fragennummer][schwierigkeit])){
            if(Antwort3 == true){
                JOptionPane.showMessageDialog(null, "Richtig; mach weiter so :)");
            }
            if(Antwort2 == true){
                JOptionPane.showMessageDialog(null, "Leider falsch :). Richtig wäre Antwort c");
            }
            if(Antwort1 == true){
                JOptionPane.showMessageDialog(null, "Leider falsch :). Richtig wäre Antwort c");
            }
 

Zurück
Oben