Java While-Schleife hört nicht auf?
Hallo. Ich versuche auf Java ein Spiel zu programmieren und meine Schleife hört einfach nicht auf zu laufen also das Spiel hängt sich quasi auf und macht nichts mehr, ihr wisst was ich meine :D
Wäre super lieb wenn mir jemand helfen könnte.
Hier ist mein Code:
boolean nochmal;
nochmal = true;
if (läuft) {
while (nochmal) {
if (tf_frage.getText().equals("14*6") && tf_eingabe.getText().equals("84")) {
tf_eingabe.setBackground(Color.green);
nochmal = false;
JOptionPane.showMessageDialog(null, "Ergebnis", "Ihre Antwort war richtig!", JOptionPane.INFORMATION_MESSAGE);
} // end of if
else if (tf_frage.getText().equals("13*8") && tf_eingabe.getText().equals("104")){
tf_eingabe.setBackground(Color.green);
nochmal = false;
JOptionPane.showMessageDialog(null, "Ergebnis", "Ihre Antwort war richtig!", JOptionPane.INFORMATION_MESSAGE);
} // end of if-else
else if(tf_frage.getText().equals("11*12") && tf_eingabe.getText().equals("132")) {
tf_eingabe.setBackground(Color.green);
nochmal = false;
JOptionPane.showMessageDialog(null, "Ergebnis", "Ihre Antwort war richtig!", JOptionPane.INFORMATION_MESSAGE);
} // end of if-else
else if (tf_frage.getText().equals("19*4") && tf_eingabe.getText().equals("76")) {
tf_eingabe.setBackground(Color.green);
nochmal = false;
JOptionPane.showMessageDialog(null, "Ergebnis", "Ihre Antwort war richtig!", JOptionPane.INFORMATION_MESSAGE);
} // end of if-else
else if (tf_frage.getText().equals("9*16") && tf_eingabe.getText().equals("144")){
tf_eingabe.setBackground(Color.green);
nochmal = false;
JOptionPane.showMessageDialog(null, "Ergebnis", "Ihre Antwort war richtig!", JOptionPane.INFORMATION_MESSAGE);
} // end of if-else
else if (tf_frage.getText().equals("12*17") && tf_eingabe.getText().equals("204")) {
tf_eingabe.setBackground(Color.green);
nochmal = false;
JOptionPane.showMessageDialog(null, "Ergebnis", "Ihre Antwort war richtig!", JOptionPane.INFORMATION_MESSAGE);
} // end of if-else
else if (tf_frage.getText().equals("16*7") && tf_eingabe.getText().equals("112")) {
tf_eingabe.setBackground(Color.green);
nochmal = false;
JOptionPane.showMessageDialog(null, "Ergebnis", "Ihre Antwort war richtig!", JOptionPane.INFORMATION_MESSAGE);
} // end of if-else
else {
tf_eingabe.setBackground(Color.red);
} // end of if-else
} // end of while
} // end of if
3 Antworten
ohne mir das jetzt genauer anzuschauen, ein paar Anmerkungen, ein solches Konstrukt wie du da geschrieben hast, ist .... nicht schön ;)
ich hab dir mal kurz zwei methoden geschrieben mit denen du das ganze schonmal um einiges schöner und kürzer machen kannst, vermeide solche if-else Bedingungen mit so vielen "else if's"
versuche auch deinen Code in Methoden aufzuteilen, als grobe Richtlinie pro Methode nicht mehr als 20, vielleicht 30 Zeilen (manchmal ist es besser wenn eine Methode mehr Zeilen hat aber mehr wie 100 ist meistens nicht wirklich sinnvoll)
private void checkQuestionAndSetColor(JTextField answerField,String correctAnswer) {
boolean wasAnsweredCorrectly = checkIfQuestionWasAnsweredCorrect(answerField, correctAnswer);
if(wasAnsweredCorrectly) {
answerField.setBackground(Color.GREEN);
}else {
answerField.setBackground(Color.RED);
}
}
private boolean checkIfQuestionWasAnsweredCorrect(JTextField answerField,String correctAnswer) {
return answerField.getText().trim().equals(correctAnswer);
}
Wenn das alles in einem Thread läuft, dann ist das klar, dass es einfriert.
Bei while true wird der aktuelle Thread eben solange blockiert, bis die Schleife beendet ist, also nie. Währendessen kann eben das GUI nicht aktualisiert werden und auch kein Input mehr entgegengenommen werden.
Du solltest generell Abstand von einer derartigen Konstruktion nehmen. Damit lastest du den Prozess zu 100% aus, so schnell er kann die Schleife zu wiederholen.
Wenn du schon sowas baust, dann muss diese Methode in einem eigenen Thread laufen. Dazu kann man die Java Klasse Thread benutzen, oder eine eigene basteln, die Thread erweitert. zusätzlich sollte man vermeiden, dass die Schleife zu schnell hintereinander ausgeführt wird. Das könnte man z.b. mit Thread.sleep(xxxx ms) einschränken.
Noch besser wäre es, die Abfrage auf "richtig" oder "falsch" über ein Event zu triggern, statt permanent zu prüfen. Z.b. nach jedem erfolgten Zeicheninput.
Vvermutlich wird immer das ELSE ausgeführt und "nochmal" bleibt immer True.
Lösung: Debugger Auspacken und nachsehen was da schief geht ;)
Das war damals, als Java noch interpretiert wurde. Compiliertes Java ist wesentlich schneller.
Und wie beende ich die Schleife? Ich dachte, mit dem was in der Klammer nach dem While steht einfach auf false setzen...