Endlosschleife mit Startbutton starten und Stopbutton stoppen

Hallo Leute,

ich bin relativ unerfahren in Java und sitze gerade an einem kleinen Tool, das beim Klick auf Start eine Endlosschleife starten soll, welches dann immer zwei Werte zufällig ausgibt und dann zufällig ein, zwei oder drei Sekunden zwischen dem Wechsel der Werte wartet.
Das funktioniert alles auch wunderbar, nur kann ich es nicht wie gewünscht stoppen... :(

Ich wollte mit einem BooleanFlag "run" arbeiten, dass bei Klick auf den "EndButton" auf "false" gestellt werden sollte, um die Schleife zu stoppen.

Der Fehler muss hier irgendwo im Code liegen:


Java:
public void actionPerformed(ActionEvent e){       
       
        if(e.getSource() == StartButton){
        run = true;   
        do{
            a= (int) ((Math.random()*length1));
            b= (int) ((Math.random()*length2));
            c= (int) ((Math.random()*3+1));
           
            label1.setText(""+array1[a]+"");
            label2.setText(""+array2[b]+"");
           
            if(c==1){
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e1) {
                    e1.printStackTrace();
                }
            }else if (c==2){
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e1) {
                    e1.printStackTrace();
                }
            }else if (c==3){
                try {
                    Thread.sleep(3000);
                } catch (InterruptedException e1) {
                    e1.printStackTrace();
                }
            }
           
        }while(run);
           
        }
        

        if(e.getSource() == EndButton){

            System.out.println("Beendet!");
            run=false;

        }
        
   
    }



Ich würde mich freuen, wenn mir hier jemand weiterhelfen könnte :)
 

Joose

Top Contributor
Kannst du den "EndButton" klicken oder ist die UI eingfroren?
Dein Problem ist das du deine Endlosschleife innerhalb des UI Threads (EDT) ausführst, dadurch blockierst du eben diesen Thread. Einerseits kann der Thread dadurch nicht neuzeichnen andereseits ist die Ausführung von Events blockiert, da alle diese Events im EDT ausgeführt werden.

Lagere deine Schleife in einen eigenen Thread aus.
 
Vielen Dank für die schnelle Rückmeldung :)
Ehrlich gesagt weiß ich nicht wie ich das machen kann oder soll :-/
Bin mit Java nicht so vertraut und arbeite mich Stück für Stück mit kleinen Tools ran...
Wenn ich dir den gesamten Code schicke, könntest du es dir dann mal anschauen?
 

Joose

Top Contributor
Wir können es gerne hier lösen. :)
Was genau verstehst du nicht? Wo liegt genau das Problem?

Im vorherigen Post habe ich dich schon mal gefragt ob du den Button klicken kannst oder ob deine UI eingefrorern ist.
 
Ja, UI ist eingefroren und Button kann also nicht geklickt werden.

Ich verstehe an sich nach etwas einlesen das Konzept der Threads schon und dass ich damit dann Funktionen in andere Threads auslagern kann, damit diese dort genutzt werden können.
Aber ich weiß/verstehe nicht, wie ich es in meinem Code umsetzen kann/soll...

Hier mal der Code:

Java:
import java.awt.*;
import java.awt.event.*;

public class Gui extends Frame implements ActionListener{
    private static final long serialVersionUID = 1L;

    static Button StartButton = new Button("Start!");
    static Button EndButton = new Button ("Stop!");
   
    int a, b, c;
    int r1, r2, r3;
    public boolean run = true;
   
    String[] array1 = {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q"};
    int length1 = array1.length;
    String[] array2 = {"1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13"};
    int length2 = array2.length;

    static Label label1=new Label("");
    static Label label2=new Label("");
   
    public Gui(String s){
        super(s); 
       
        setLayout(new GridLayout(2,2,2,2));
               
        StartButton.addActionListener(this);
        EndButton.addActionListener(this);
        setSize(500,500);
        add(label1);
        add(label2);
       
        add(StartButton);
        add(EndButton);
       
        this.addWindowListener(new WindowAdapter(){
            public void windowClosing(WindowEvent e){
                dispose();
                System.exit(0);
            }
        });
       
       
        pack();
        setVisible(true);                          
    }

    public void actionPerformed(ActionEvent e){       
       
        if(e.getSource() == StartButton){
        run = true;   
        do{
            a= (int) ((Math.random()*length1));
            b= (int) ((Math.random()*length2));
            c= (int) ((Math.random()*3+1));
           
            System.out.println("Gestartet!");
            System.out.println(""+a+"");
            System.out.println(""+b+"");
            System.out.println(""+c+"");
           
            label1.setText(""+array1[a]+"");
            label2.setText(""+array2[b]+"");
           
            if(c==1){
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e1) {
                    e1.printStackTrace();
                }
            }else if (c==2){
                try {
                    Thread.sleep(2000);
                } catch (InterruptedException e1) {
                    e1.printStackTrace();
                }
            }else if (c==3){
                try {
                    Thread.sleep(3000);
                } catch (InterruptedException e1) {
                    e1.printStackTrace();
                }
            }
           
        }while(run);
           
        }
       
        if(e.getSource() == EndButton){
           
            System.out.println("Beendet!");
            run=false;
           
        }
           
    }
}


Danke vorab :)
 

Joose

Top Contributor
Erstelle eine Klasse welche das Interface "Runnable" implementiert, dafür musst du die "run" Methode implementieren.
In diese "run" Methode schreibst du dann deine gewünschte Schleife. Die Klasse sollte außerdem dann eine "stop" Methode enthalten sowie das Attribut "run".

In deiner Gui Klasse erstellst du dann ein einen Thread und übergibst ein Objekt deiner Runnable Klasse und startest den Thread.
Wenn du den Thread stoppen willst rufst du von deinem Runnable Objekt eben die "stop" Methode auf.

Hier hast du ein Beispiel: https://docs.oracle.com/javase/tutorial/essential/concurrency/runthread.html
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Endlosschleife beim Verteilen von Objekten Allgemeine Java-Themen 4
E Gewollte Endlosschleife unterbrechen oder Alternative gesucht Allgemeine Java-Themen 2
H Thread wird willkürlich in der Endlosschleife beendet Allgemeine Java-Themen 8
J Endlosschleife durch wechselseitigen Zugriff zweier Klassen? Allgemeine Java-Themen 2
V fehlermeldung heap space, endlosschleife??? Allgemeine Java-Themen 4
T thread endlosschleife alle 3 sek Allgemeine Java-Themen 9
P java high cpu load wegen endlosschleife Allgemeine Java-Themen 6
A Endlosschleife + Event Allgemeine Java-Themen 7
S Java Programm lässt sich vom USB-Stick starten, aber nicht von HDD Allgemeine Java-Themen 16
E Java .exe Datei mit args starten Allgemeine Java-Themen 2
Lukas2904 Automatisches starten des Programms Allgemeine Java-Themen 5
N jar File auf Mac mit Doppelklick starten Allgemeine Java-Themen 5
O Jar lässt sich auf bestimmten Pc nicht starten Allgemeine Java-Themen 18
I Threads AudioInputStream separat starten und beenden; parallel programming Allgemeine Java-Themen 2
G Jar lässt sich mit macOS nicht starten Allgemeine Java-Themen 9
Tommy135 Input/Output Application aus Java package starten Allgemeine Java-Themen 2
H Erste Schritte Ausführbare Dateien lassen sich nicht starten Allgemeine Java-Themen 5
ralfb1105 Classpath putty.exe aus JAR starten Allgemeine Java-Themen 37
ralfb1105 Starten Java App(s) (.jar) aus einem Java Programm Allgemeine Java-Themen 18
temi Java Programm aus einer DB laden und starten Allgemeine Java-Themen 2
F .jar erstellen und starten Allgemeine Java-Themen 15
E Mit Java ein Python Programm starten Allgemeine Java-Themen 20
D Compiler-Fehler Ich kann meinen Kompilierer nicht starten. Allgemeine Java-Themen 16
R probleme beim starten von jar unter linux Allgemeine Java-Themen 2
L Eclipse JavaFX Klasse starten programmatisch Allgemeine Java-Themen 1
V JavaFX Fehler beim Starten einer Jar Allgemeine Java-Themen 7
A Javaagent auf WebApplication starten Allgemeine Java-Themen 0
B JAVA - mehrere Clienten gleichzeitig starten. Nicht bei Code! Allgemeine Java-Themen 3
T Starten vom Thread Allgemeine Java-Themen 3
A Linux: Native Library mit Rootrechten ohne Prozess mit sudo zu starten Allgemeine Java-Themen 1
K Problem: Java-Klasse mit mehreren Threads als eigenen Prozess starten Allgemeine Java-Themen 3
Thallius Neuen Prozess starten, der auch nach Beedingung des Starter-Prozesses weiterläuft? Allgemeine Java-Themen 5
P Threads Threads nicht gleichzeitig starten Allgemeine Java-Themen 3
Maxim6394 Jar Dateien starten nicht Allgemeine Java-Themen 7
C Mit Pc Awendungen auf Server starten Allgemeine Java-Themen 8
M Eclipse Eine xhtml aus einem JSF Projekt starten Allgemeine Java-Themen 2
Developer_X Java Applets in Browser starten Allgemeine Java-Themen 9
N GOM-Database Program - wie starten Allgemeine Java-Themen 0
F Java Anwendung Remote starten geht nicht Allgemeine Java-Themen 0
F Spiel lässt sich nicht aus GUI starten Allgemeine Java-Themen 5
P Starten einer Java .jar-Datei Allgemeine Java-Themen 0
J jar Datei per Doppelklick starten Allgemeine Java-Themen 6
D neuen Prozess starten und anwendung beenden. Allgemeine Java-Themen 3
B Webbrowser mit Proxy- Verbindung starten Allgemeine Java-Themen 6
K Spiele starten nicht richtig Allgemeine Java-Themen 2
M Problem beim Starten der Anwendung Allgemeine Java-Themen 3
B Java GUI via SSH starten... Allgemeine Java-Themen 5
S VLC + Lied über Java starten Allgemeine Java-Themen 17
R Java-Progamm über Icon starten unter Windows Allgemeine Java-Themen 9
C Ubuntu-VM Java starten Allgemeine Java-Themen 24
A Programm will nicht starten... Allgemeine Java-Themen 7
Hoppelmann JAR mit Libaries und Natives vom Programm aus starten Allgemeine Java-Themen 5
V .jar nicht zweimal starten Allgemeine Java-Themen 4
C Java Programm über SSH starten Allgemeine Java-Themen 16
Jackii Java Programm aus anderen Java Programm starten Allgemeine Java-Themen 20
A Javaprogramm als Windowsservice starten Allgemeine Java-Themen 4
C Threads ExecutorService shutdown abbrechen und service "starten" ? Allgemeine Java-Themen 3
J Explorer über Code starten Allgemeine Java-Themen 15
G Java Programm aus Java Programm starten Allgemeine Java-Themen 6
X Neuerdings ein Problem mit dem Starten von Jars Allgemeine Java-Themen 5
C .jar bei Login starten Allgemeine Java-Themen 7
D Java Excel API - Schreiben in Excel lässt sich nicht über Makro starten Allgemeine Java-Themen 18
A Jars oder JNLPs aus java code in gleicher JVM starten Allgemeine Java-Themen 2
N Internet Explorer mit bestimter Java Runtime starten Allgemeine Java-Themen 2
G mehrere Threads starten/stoppen Allgemeine Java-Themen 4
K Programm mit verschiedenen Parametern starten Allgemeine Java-Themen 2
S Applet maximiert starten Allgemeine Java-Themen 5
T Externes Programm auf anderem Bildschirm starten Allgemeine Java-Themen 3
F Externes Programm starten, Speicheraufwändig Allgemeine Java-Themen 7
C Java Anwendung nur einmalig starten Allgemeine Java-Themen 10
Q Java aus Java starten Allgemeine Java-Themen 21
E Anwendung starten Allgemeine Java-Themen 3
E Programm von Main Methode starten Allgemeine Java-Themen 9
L AccessControlException beim starten aus einem Shellskript Allgemeine Java-Themen 3
J Java-Klasse über Konsole starten Allgemeine Java-Themen 6
T Java Programm aus anderem Java Programm starten Allgemeine Java-Themen 13
J Eclipse Java Programm aus anderem Java Programm starten Allgemeine Java-Themen 14
H Swing jar-Dateien starten nicht auf konventionellem Wege. Allgemeine Java-Themen 6
Y Anwendung starten(JAR) - Entscheidung Konsole oder Swing Allgemeine Java-Themen 5
K Prozess starten, überwachen und beenden Allgemeine Java-Themen 4
P Thread starten / stoppen / neustarten Allgemeine Java-Themen 8
T Javaprogramm unter Linux auf bestimmten Kern starten/laufen lassen ? Allgemeine Java-Themen 22
P Windows Media Player starten / finden Allgemeine Java-Themen 2
K Starten eines Threads Allgemeine Java-Themen 13
C Beste Möglichkeit eine jar mit großem Heapspace zu starten ? Allgemeine Java-Themen 8
D Starten von Threads via JVM Allgemeine Java-Themen 7
C .jar unter Windows7 über den Explorer starten Allgemeine Java-Themen 6
M Java Programm als Dienst starten... Allgemeine Java-Themen 4
T doppeltes Starten verhindern Allgemeine Java-Themen 14
S Seperaten Thread starten Allgemeine Java-Themen 5
L Thread kurz unterbrechen und wieder starten Allgemeine Java-Themen 5
V Shellscript über ProcessBuilder starten Allgemeine Java-Themen 2
J Threads mehrmals starten Allgemeine Java-Themen 18
X Aus Java Applikation externes Programm starten Allgemeine Java-Themen 3
S Jar Datei mit mehr Speicher starten Allgemeine Java-Themen 2
L Jar File aus Quelltext heraus starten Allgemeine Java-Themen 9
M Java Klasse automatisch starten Allgemeine Java-Themen 3
E Zweites Java Programm sichtbar starten Allgemeine Java-Themen 4
C Name einlesen und Programm starten Allgemeine Java-Themen 2
B MVC: controller in unabhängigen thread von der view starten (gui friert ein) Allgemeine Java-Themen 5

Ähnliche Java Themen

Neue Themen


Oben