Endlosschleife auf JButton druck beenden

rufux

Mitglied
Huhu erstmal,

bin neu hier im Forum und werde ab sofort auch öfters hier anzutreffen sein 🙂

Habe nach Jahren mal wieder angefangen ein wenig zu programmieren.

Programmiere gerade ein kleines Tool für meine Bildersammlung.
Im Prinzip: scanne ich meine Bilder mit der Klasse Robot auf bestimmte Farben,was soweit auch funktioniert.

Nun habe ich das in einer Endlosschleife laufen, da ich das ganze bei einer Diashow mache. (Was bei 10000 Bildern einfach schneller geht) 😉

Nun habe ich mir nen kleines Fenster gebaut mit zwei Buttons... Grundsätzlich start und stop.

start funktioniert auch ohne Probleme.
aber ich schaffe es nicht mit dem stop Button zu beenden?

wie kann ich da am besten rangehen.
In diversen anderen Programmiersprachen würde ich mit Interupts arbeiten, aber das geht ja leider nicht?

Need Help.
Danke
 
das simpelste wäre mit sicherheit ne boolsche variabel, die solange sie aktiv ist die endlosschleife aktiv hält .. stellst du sie per button auf false beendet sich die geschichte nach dem letzten durchlauf einfach. Aber dazu ist eventuell mehr Code nötig, um spezifischere lösungen angeben zu können
 
Wenn es in einem eigenen Thread läuft, könntest du mit interupt arbeiten. Du könntest aber auch einfach ein flag setzen, welches du in der Schleife prüfts, wenn diese false ist, dann führst du keinen weiteren durchlauf durch und bist raus.
 
Das mit dem Flag habe ich mir auch schon überlegt.

Also ich habe eine Klasse mit zwei funktionen: erkennung (func: started / stoped)
Started macht im prinzip nichts anderes als das Bild nach bestimmten Pixelwerten hin zu untersuchen.
Das ganze habe ich dann in einer do-while Schleife...

also
Code:
int i = 0;

do{
...
}while(i!=1}
habe dann eine Funktion in der Klasse:

Code:
public static void stoped(){
i=1;
}

So nun habe ich eine Klasse AppWindow mit meinen Buttons und unter anderem die beiden Funktionen:

Code:
public void buttonStartclicked(){
erkennung.started();
}

public void buttonStopClicked(){
erkennung.stoped()}

so sieht es im Moment aus.

wenn ich den start Button klicke bleibt der auch aktiv?
weiß nicht weiter.
Vielleicht könnt Ihr mir helfen.

VG
 
was genau ist erkennung und wie sieht der code sonst noch aus?

generell sollte das sowas werden:
Java:
public class XY implements Runnable {

    boolean keepRunning = true;

    public void run() {
        while (keepRunning) {
            ...
        }
    }

    //wird von aussen aufgerufen
    public void stopExecution() {
        keepRunning = false;
    }
}

das ganze wäre quasi ein extra Thread der solange läuft bis du ihn stoppst, oder er irgendwie unterbrochen wird.
 
Also so ähnlich hatte ich es auch, halt mit ner int variablen...
aber das geht auch nicht!

habs jez so...
Java:
public class erkennung implements Runnable{
static boolean i=true;

public static void started(Strings[] args) throws AWTException{
Robot robot = new Robot();
do
Color pixel = new Color(0,0,0);
Color white = new Color(255,255,255);
...


pixel = robot.getPixelColor(x,y);

...

if(white.equals(pixel){
System.out.println("white");
}....
else{
System.out.println("no saved color");
}
while(i);
System.out.println("end");

....
}

public static void stoped(){
i=false;
}


da der gesamte Code zu lang wäre nur ein Auszug mit allein wichtigen Sachen...

Der JButton Aufruf funktioniert wie folgt:
Java:
JButton start = new JButton("start");
start.addActionListener (new ActionListener(){
 public void actionPerformed(ActionEvent arg0){
  buttonStartClicked();}});

dazu natürlich noch der stop Button.. gleiche Syntax nur mit stop.

Die Funktionen:

Java:
public void buttonStopClicked(){
ekennung.stoped();
}

public void buttonStartClicked(){
erkennung.started();
}

aber so funktioniert es leider immer noch nicht

Edit: also das starten klappt/ beenden leider nicht
 
Zuletzt bearbeitet:
Kann es sein das die ActionListener und die Endlosschleife im selben Thread arbeiten? Starte die Endlos Action in einem eigenen Thread. Dann sollte es klappen.

Java:
EndlosAction meineAction = new EndlosAction();

Java:
public void buttonStartClicked(){
meineAction.run();
}
public void buttonStopClicked(){
meineAction.stop();
}
 
Zuletzt bearbeitet:
Bin leider nicht so versiert im Umgang mit Java..

Wann laufen denn beide Befehle im selben Thread...

habe das jetzt imo so:

[Java]

public class AppWindow extends JFrame{
Erkennung erkennung = new Erkennung();

public AppWindow(){
...
}

protected void initWindow(){
...

// hier ist auch der ActionListener drin
}
public void buttonStopClicked(){
erkennung.stoped();
}

public void buttonStartClicked(){
erkennung.started();
}
[/Java]
 
Zuletzt bearbeitet:
das ding ist, wenn du schon Runnable implementierst, dann schieb die komplette Endlosschleife und alles was du da für berechnungen brauchst in die run-Methode!

beim druck auf startbutton dann einfach

Java:
new Thread(new Erkennung()).start()

wenn mich mein gedächtnis nicht grad ganz verlässt
 
Hier eine weitere Alternative: Swingworker
Beispiel:
Java:
WorkForMe workForMe=null;

    class WorkForMe extends SwingWorker<Object, Object> {

            @Override
            protected Object doInBackground() throws Exception {                
                // mach was .. labels aktualisieren funktioniert hier auch ;)
                return null;
            }

            @Override
            protected void done() {
               // fertig
            }
        }
public void buttonStopClicked(){
        workForMe.cancel(true);
}
 
public void buttonStartClicked(){
    workForMe = new WorkForMe();
     workForMe.execute();
}

gruß
 

Zurück
Oben