Swing Programm friert ein...

Arif

Aktives Mitglied
Hallo, ich wollte ein kleines Spiel programmieren (ich bin kein Profi). Am Anfang erscheint ein kleinen Menü mit 2 JButtons und JLabels. Wenn ich auf "Spiel starten" klicke soll das Menü verschwinden und das ist das Problem. Ich habe eine Methode play() geschrieben,
wo alle Figuren neu berechnet und gezeichnet werden, und das funktioniert aber das Problem ist, dass diese Routine (berechnen und zeichnen) permanent durchgeführt werden soll, und dafür verwende ich die Endlosschleife. Wenn ich die Endlosschleife weg lasse funktioniert das Programm, aber es wird nur einmal gezeichnet, wenn ich die Endlosschleife implementiere "friert"
das Programm ein. Das Spiel hänge ich an, damit ihr es genauer betrachten könnt.

Spiel : https://www.dropbox.com/s/2kp3vnh3k6gamwg/Test.zip?dl=0

Java:
private void play() {
        while (true) {
            fr.repaint();
         
            try {
                Thread.sleep(15);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
 
Zuletzt bearbeitet:
Deine GUI friert ein, da du keine Endlosschleifen in Events packen darfst. Du startest das Spiel in Zeile 84 in deiner Main-Klasse, allerdings in einem ActionListener. Das Problem dabei, wenn du mit einer Endlosschleife in dieser Methode verweilst (also einem ActionListener), so kann das Programm nicht mehr auf neue Events von der GUI reagieren.

Ich weiß nicht wie das Problem spezifisch in Java zu lösen ist, da ich mich mit GUIs (in Java) auch erst beschäftige. Ich weiß nicht wie intern die Swing Bibliothek arbeitet und ob die Events noch reagieren, wenn du die While-Schleife in deine main-Methode einbindest. Aber ich meine mich zu erinnern irgendwo was gesehen zu haben was die Lösung deines Problemes entspricht. Vielleicht meldet sich ja hier jemand zu Wort bevor ich's recherchieren konnte. LG 🙂

€dit: Ah okey... Das mit der While-Schleife in der main-Methode auszulagern klappt so nicht. Jedoch kannst du mit einem neuen Thread oder mit dem SwingWorker ( https://docs.oracle.com/javase/8/docs/api/javax/swing/SwingWorker.html ) arbeiten. Vielleicht gibt's aber noch andere Lösungen. Mal schauen wer sich hier noch meldet.
 
Zuletzt bearbeitet:

Neue Themen


Zurück
Oben