Ausführen pausieren

Max K.

Mitglied
Hi,

ich möchte eine Kugel bewegen und das ganze auch pausieen können (das Bewegen klappt schon).
Dafür habe ich einen Thread, in dem mit einer endlosen while-Schleife die Koordinaten der Kugel erhöht werden.
Nun möchte ich aber bei einem Buttonklick pausieren. Den ActionListener habe ich schon, aber wie sage ich dem femden Thread nun, dass er waten soll, bis ich ihn wieder wecke?

Ich probiere nun schon seit Stunden rum und krige nichts mehr hin.

Danke schonmal im Voraus!


Max K.
 

Marco13

Top Contributor
Ganz grob.. mit einem Flag...
Code:
class Animator implements Runnable
{
    private boolean paused = false;

    public synchronized void setPaused(boolean p)
    {
        if (paused != p)  
        {
            paused = p;
            notifyAll();
        }
    }

    public void run()
    {
        while (true)
        {
            while (paused)
            {
                synchronized(this) { wait(); } // try/catch drum...
            }
            bewegen();
        }
    }

}
 

javimka

Top Contributor
Durch einen ActionListener könntest du ein boolean setzen. Der andere Thread prüft dieses boolean ständig und falls es gesetzt ist, ruft der Thread die pause-Funktion auf. Die Funktion braucht dazu ein beliebiges Objekt aus der Klasse, indem die pause-Funktion liegt. Um den Thread weiter laufen zu lassen, muss ein anderer Thread dann resume aufrufen.
Das könnte etwas so aussehen:
Java:
private Object lock = new Object();

private void pause() {
  synchronized(lock) {
    lock.wait();
  }
}

public void resume() {
  synchronized (lock) {
    lock.notifyAll();
  }
}
 

Max K.

Mitglied
Erstmal danke!

Ich habe das jetzt gemacht, wie Marco13geschrieben hat. Es funktioniert soweit auch alles, nur beim Wiederstarten kommt er (das habe ich durch Tests mit System.out.print() herausgefunden) nur bis in die void setPaused. Das NotifyAll füht nicht dazu, dass das Bewegen weitergeht.
 

Marco13

Top Contributor
Jetzt ein Beispiel zu posten, wo man sieht, dass es DOCH geht, würde wohl nichts bringen ... oder vielleicht doch? ???:L Aber poste mal deinen aktuellen Stand, am besten als KSKB
 

Max K.

Mitglied
Java:
    Object o = new Object();

    public synchronized void setPaused(boolean p)
    {
        if (paused != p)  
        {
            paused = p;
            synchronized (o){
                o.notify();            	
            }

        }
    }


Java:
		while (wei){
			synchronized (o){
				while (paused){
					try {
						o.wait();
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
bewegen();
 

Max K.

Mitglied
Ok, wenn du den Code willst:

Erste Class:
Java:
public class ablauf {
static Thread bew;
static drawShape kugel;
static move mo;
	/**
	 * @param args
	 */
	public static JFrame openFrame (){
		JFrame f = new JFrame();		
		f.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
		f.setSize( 700, 500 );
		f.setResizable(false);
		f.setVisible( true );
		return f;	
	}
	public void end (){
		System.exit(0);
	}
	public static JPanel drawit () {
		drawShape kugel = new drawShape();
		return kugel;
	}
	public static void main(String[] args) {
		ActionListener stopper = new ActionListener(){
			public void actionPerformed(ActionEvent e) {

				mo = new move(kugel);
				mo.setPaused(true);

			}


		};
		ActionListener weitermachen = new ActionListener(){
			public void actionPerformed(ActionEvent e){
					mo = new move(kugel);
					mo.setPaused(false);
			}
		};
		// TODO Auto-generated method stub
		JFrame f = openFrame();
		JPanel kugel = drawit();
		f.setLayout(null);
		kugel.setBounds(0, 0, 50, 50);
		f.add(kugel);
		JButton stop = new JButton("Anhalten");
		JButton weiter = new JButton("Weiter");
		weiter.setBounds(200, 100, 100, 50);
		stop.setBounds(100,100,100,50);
		f.add(stop);
		f.add(weiter);
		weiter.addActionListener(weitermachen);
		stop.addActionListener(stopper);
		bew = new Thread(new move(kugel));
		bew.run();
	}

}

Zweite Class:
Java:
public class move implements Runnable{
	JPanel kugel;
	int x = 0;
	int y = 0;
	int vx = 1;
	int vy = 1;
	int mx = 700-60;
	int my = 500-60;
	int frequenz = 10;
	boolean enlx = true;
	boolean enly = true;
	static boolean wei = true;
    private static boolean paused = false;

    Object o = new Object();

    public synchronized void setPaused(boolean p)
    {
        if (paused != p)  
        {
            paused = p;
            synchronized (o){
                o.notify();
            }
        }
    }

	
	
	public move(JPanel kugel2) {
		// TODO Auto-generated constructor stub
		kugel = kugel2;
	}
	public synchronized void run (){
		while (wei){
			synchronized (o){
				while (paused){
					try {
						o.wait();
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				}
		if (enlx & x<=mx){
			x = x+vx;
		}
		if (enlx & x>mx){
			x = x-vx;
			enlx = false;
		}
		if (!enlx & x>0){
			x = x-vx;
		}
		if (!enlx & x<=0){
			x = x+vx;
			enlx = true;
		}
		
		
		if (enly & y<=my){
			y = y+vy;
		}
		if (enly & y>my){
			y = y-vy;
			enly = false;
		}
		if (!enly & y>0){
			y = y-vy;
		}
		if (!enly & y<=0){
			y = y+vy;
			enly = true;
		}
		
		kugel.setBounds(x, y, 50, 50);
		try {
			Thread.sleep(frequenz);
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		}}
	}
	public static void start(){
	}
	public static void stop(){


	}


}

Dritte Class:
Java:
public class drawShape extends JPanel{
	@Override
	protected void paintComponent ( Graphics g ) {
		g.drawOval(0, 0, 50, 50);
	}

}

Bitte nicht über unschönes Coding beschweren, ich bin Anfänger!;(
 

Marco13

Top Contributor
Es ist NICHT dasselbe "o" - es ist ja nichtmal dasselbe "mo" (die Variablennamen solltest du vielleicht nochmal überdenken ;) ). In der actionPerformed erstellst du ja ein neues Objekt:
mo = new move(kugel);

Schreib diese Zeile EINmal im Konstruktor, und lass sie an den anderen Stellen weg. Wenn's dann noch nicht geht, compilier' ich's mal :D
 

ThreadPool

Bekanntes Mitglied
Ich hab dir das mal notdürftig gefixt so dass es läuft.

Java:
import javax.swing.JPanel;

public class move implements Runnable{
    JPanel kugel;
    int x = 0;
    int y = 0;
    int vx = 1;
    int vy = 1;
    int mx = 700-60;
    int my = 500-60;
    int frequenz = 10;
    boolean enlx = true;
    boolean enly = true;
    private volatile boolean paused = false;
 
    Object o = new Object();
 
    public void setPaused(boolean p)
    {
        if (paused != p)  
        {
            paused = p;
            synchronized (o){
                o.notify();
            }
        }
    }
 
    
    
    public move(JPanel kugel2) {
        // TODO Auto-generated constructor stub
        kugel = kugel2;
    }
    public void run (){
        while (true){
            
        	synchronized (o){
                while (paused){
                    try {
                        o.wait();
                    } catch (InterruptedException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }
                }
                
        if (enlx & x<=mx){
            x = x+vx;
        }
        if (enlx & x>mx){
            x = x-vx;
            enlx = false;
        }
        if (!enlx & x>0){
            x = x-vx;
        }
        if (!enlx & x<=0){
            x = x+vx;
            enlx = true;
        }
        
        
        if (enly & y<=my){
            y = y+vy;
        }
        if (enly & y>my){
            y = y-vy;
            enly = false;
        }
        if (!enly & y>0){
            y = y-vy;
        }
        if (!enly & y<=0){
            y = y+vy;
            enly = true;
        }
        
        kugel.setBounds(x, y, 50, 50);
        
        try {
            Thread.sleep(frequenz);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        }}
    }
  }

Java:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class ablauf {
static Thread bew;
static drawShape kugel;
static move mo = null;
    /**
     * @param args
     */
    public static JFrame openFrame (){
        JFrame f = new JFrame();        
        f.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
        f.setSize( 700, 500 );
        f.setResizable(false);
        f.setVisible( true );
        return f;   
    }
    public void end (){
        System.exit(0);
    }
    public static JPanel drawit () {
        drawShape kugel = new drawShape();
        return kugel;
    }
    public static void main(String[] args) {
        ActionListener stopper = new ActionListener(){
            public void actionPerformed(ActionEvent e) {
                mo.setPaused(true);
            }
       };
        ActionListener weitermachen = new ActionListener(){
            public void actionPerformed(ActionEvent e){
                    mo.setPaused(false);
            }
        };
        // TODO Auto-generated method stub
        JFrame f = openFrame();
        JPanel kugel = drawit();
        f.setLayout(null);
        kugel.setBounds(0, 0, 50, 50);
        f.add(kugel);
        JButton stop = new JButton("Anhalten");
        JButton weiter = new JButton("Weiter");
        weiter.setBounds(200, 100, 100, 50);
        stop.setBounds(100,100,100,50);
        f.add(stop);
        f.add(weiter);
        weiter.addActionListener(weitermachen);
        stop.addActionListener(stopper);
        mo = new move(kugel);
        bew = new Thread(mo);
        bew.start();
    }
 
}
 

Marco13

Top Contributor
Halt, da unten steht ja nochmal
bew = new Thread(new move(kugel));
... wart mal, ich räum mal auf...


EDIT: Ah, da war ThreadPool schneller. Nomen es omen :D
 

Max K.

Mitglied
Danke, danke, danke! Das ist echt voll nett von euch. Jetzt geht es.

Aber auch ich habe nicht geschlafen und mittlerweile eine Lösung ohne wait und notify ausgegraben. Ist aber nicht so schön!

Jetzt habe ich allerdings gleich das nächste Problem. Das bewegte Teil ruckelt ziehmlich. Bei Delphi gibt's dagegen ja irgendeine Methode (doppelt buffern). Gibt es soetwas bei Java auch und wie benutzt man das?
 

Marco13

Top Contributor
Bei Swing ist DoubleBuffering eigentlich schon eingebaut, da braucht man nichts mehr per Hand zu machen. (Bei mir flackert's auch nicht, ganz nebenbei). Kannst mal schauen, ob es was hilft, die vx/vy auf z.B. 3 zu setzen, und dafür 'frequenz=30'... ist aber nur geraten...
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
H .java Dateien in Eclipse einbinden und ausführen Java Basics - Anfänger-Themen 1
E Audio Datei unter Bedingungen ausführen Java Basics - Anfänger-Themen 19
H Nutzt Eclipse alle CPU-Threads beim Ausführen von Java-Programmen? Java Basics - Anfänger-Themen 4
C 2 SwingWorkers nacheinander ausführen Java Basics - Anfänger-Themen 1
B Wie kann ich folgende Klasse/Methode per Button ausführen? Java Basics - Anfänger-Themen 1
Zrebna Kann Java Programm nicht in Konsole ausführen Java Basics - Anfänger-Themen 1
Alex_99 Aktion ausführen wenn Frame disposed wurde Java Basics - Anfänger-Themen 5
mervanpolat Binary Search Algorithmus ausführen Java Basics - Anfänger-Themen 1
hebein Mit Javaprogramm webseiten automatisiert befüllen und ausführen Java Basics - Anfänger-Themen 6
Jose05 ausführen im cmd schlägt fehl Java Basics - Anfänger-Themen 2
N Eclipse Programm normal ausführen Java Basics - Anfänger-Themen 1
M Von einem Menü Methode aus anderer Klasse ausführen, die errechnete Werte in Datei schreibt. Java Basics - Anfänger-Themen 8
D Methoden nach einer bestimmten Reihenfolge ausführen. Java Basics - Anfänger-Themen 20
Z Mehtode bei Start des Programms ausführen (Klassen übergreifend) Java Basics - Anfänger-Themen 12
J B-Sprache mit Arrays ausführen Java Basics - Anfänger-Themen 18
C Programm ausführen ohne JRE? Java Basics - Anfänger-Themen 3
B Wie kann ich etwas vor der Main-Methode ausführen? Java Basics - Anfänger-Themen 21
T src Ordner ausführen Java Basics - Anfänger-Themen 9
A Fehler beim Ausführen einer class Datei Java Basics - Anfänger-Themen 6
M Compiler-Fehler Fehler beim Ausführen des Codes Java Basics - Anfänger-Themen 25
F cmd Befehl ausführen Java Basics - Anfänger-Themen 4
H Rekursiv Methode ausführen bei Kindern Java Basics - Anfänger-Themen 12
M Rot Schwarz Bäume, ausführen? Java Basics - Anfänger-Themen 6
CptK Methoden While-Schleife so lange ausführen, wie Methode etwas zurückgibt Java Basics - Anfänger-Themen 2
F Shell Script ausführen Java Basics - Anfänger-Themen 5
F Java auf Windows Konsole ausführen Java Basics - Anfänger-Themen 1
B UML Klassen Diagramm zu Java Code Programmieren und ausführen Java Basics - Anfänger-Themen 21
L Linux Befehle unter Windows in Eclipse ausführen Java Basics - Anfänger-Themen 3
L Shell Script ausführen in Java Java Basics - Anfänger-Themen 4
K Programm ausführen Java Basics - Anfänger-Themen 2
K Durch eine Text eingabe etwas Ausführen Java Basics - Anfänger-Themen 5
CptK Methoden Event bei gedrückter Maustaste immer wieder ausführen Java Basics - Anfänger-Themen 1
CptK Klassen Event bei gedrückter Maus immer wieder mit Pause ausführen Java Basics - Anfänger-Themen 2
dapzoo Class File Version zu niedrig? Ausführen über Eingabeaufforderung nicht möglich Java Basics - Anfänger-Themen 14
alkaA Intellij Java Datei aus nicht Projekt ausführen? Java Basics - Anfänger-Themen 2
G sqlplus commands in java ausführen Java Basics - Anfänger-Themen 15
CptK Interface JTextField: Action mit Enter ausführen Java Basics - Anfänger-Themen 16
CptK Methoden Methode in MouseListner ausführen Java Basics - Anfänger-Themen 1
P jar file lässt sich nicht ausführen Java Basics - Anfänger-Themen 4
N Fehlermeldung beim ausführen des Programmes.. Java Basics - Anfänger-Themen 3
T Klassen 2 Klassen zeitgleich ausführen Java Basics - Anfänger-Themen 3
V Erste Schritte Anfänger: Ausführen eines Java-Programms Java Basics - Anfänger-Themen 5
B Java Eclipse Programm in einer Batch ausführen Java Basics - Anfänger-Themen 3
diqqerrr Java Datei als .exe ausführen Java Basics - Anfänger-Themen 8
I Erste Schritte Native code library failed to load beim Ausführen eines Beispiels Java Basics - Anfänger-Themen 5
Z Enter Taste alle 0,5 Sekunden ausführen Java Basics - Anfänger-Themen 1
H Script ausführen wenn Browser Notification eingetroffen ist? Java Basics - Anfänger-Themen 3
S Methoden Beim Start meines Projektes eine Methode ausführen Java Basics - Anfänger-Themen 14
V Methode eines Objekts einer ArrayList ausführen Java Basics - Anfänger-Themen 3
B Timer mehrere Male ausführen Java Basics - Anfänger-Themen 4
M Java Programm über Batch-Datei ausführen Java Basics - Anfänger-Themen 1
RowdyN Methoden Befehle in zufälliger Reihenfolge ausführen lassen Java Basics - Anfänger-Themen 5
T Parallel ausführen Java Basics - Anfänger-Themen 1
F Konsolen Befehl ausführen und Rückgabe auswerten Java Basics - Anfänger-Themen 3
S .java Datei in java Datei ausführen Java Basics - Anfänger-Themen 9
X Schleife bis "Bedingung" ausführen Java Basics - Anfänger-Themen 13
AssELAss Klassen Java Klasse in main-methode ausführen Java Basics - Anfänger-Themen 7
H Classpath VBScript in Jar-archiv ausführen Java Basics - Anfänger-Themen 2
F Thread um Uhrzeit ausführen Java Basics - Anfänger-Themen 5
D Input/Output Mehrere Befehle nacheinander ausführen Java Basics - Anfänger-Themen 20
quecksilver if-Abfrage in main ausführen Java Basics - Anfänger-Themen 4
F Per Klick Klasse ausführen Java Basics - Anfänger-Themen 4
S Fehler beim Ausführen Java Basics - Anfänger-Themen 5
A Methode aus einer anderen Klasse ausführen Java Basics - Anfänger-Themen 7
F Methode alle 15min ausführen Java Basics - Anfänger-Themen 5
K Exception nur im "Debug"-Modus und jedem 3.-5. mal Ausführen Java Basics - Anfänger-Themen 3
L Konsole öffnen und Java Programm darin ausführen Java Basics - Anfänger-Themen 4
J Ausführen geht nicht Java Basics - Anfänger-Themen 19
K Tastaturkombinationen ausführen Java Basics - Anfänger-Themen 5
S URL Ausführen Java Basics - Anfänger-Themen 2
D Fehlermeldung beim Ausführen eines Java Programms Java Basics - Anfänger-Themen 4
H Funktion in Hintergrund und Vordergrund ausführen Java Basics - Anfänger-Themen 11
J Eingabeaufforderung stürzt ab (beim Ausführen einer Java-Datei) Java Basics - Anfänger-Themen 3
V Algorithmus in einer Methode ausführen Java Basics - Anfänger-Themen 3
U Java Swing Timer mit ButtonKlick starten u. nach 12 Sekunden Befehl ausführen Java Basics - Anfänger-Themen 7
M Komplexe Datenauswertungen in Java oder besser auf Datenbankseite ausführen? Java Basics - Anfänger-Themen 4
E Anderes Programm ausführen Java Basics - Anfänger-Themen 8
I .lnk ausführen oder das Ziel auslesen Java Basics - Anfänger-Themen 7
L0MiN Datei lässt sich nicht ausführen Java Basics - Anfänger-Themen 3
G Variabel: Nach String benannte Methode ausführen Java Basics - Anfänger-Themen 13
S Unterschied .jar Datei ausführen und junit Testfall... Java Basics - Anfänger-Themen 3
T kann methode nicht ausführen Java Basics - Anfänger-Themen 5
D main-Methode und Tread parallel ausführen Java Basics - Anfänger-Themen 0
F Problem bei eshop -> Ausführen einer Methode über eine Shopverwaltung Java Basics - Anfänger-Themen 6
N Mit Java Befehle auf Konsole ausführen Java Basics - Anfänger-Themen 4
P Aktion ausführen wenn Button geklickt wird Java Basics - Anfänger-Themen 7
C CMD Befehl + Variable im Java-Code ausführen Java Basics - Anfänger-Themen 8
F Glassfish APP über SSL ausführen Java Basics - Anfänger-Themen 0
0 Über CMD die JAVA Datei ausführen? möglich? Java Basics - Anfänger-Themen 8
M Ausführen rückgängig machen Java Basics - Anfänger-Themen 2
S Methoden Methode einer anderen Klasse ausführen? Java Basics - Anfänger-Themen 6
G Erste Schritte Timer: In einem festgelegten Intervall eine Methode ausführen Java Basics - Anfänger-Themen 6
F alle 100ms Befehle ausführen Java Basics - Anfänger-Themen 26
K Klassen hintereinander ausführen Java Basics - Anfänger-Themen 7
D java Datei ausführen? Java Basics - Anfänger-Themen 4
W Erste Schritte Executable jar file ausführen: Programm Blast Java Basics - Anfänger-Themen 2
F Java-Programm aus CMD ausführen mit Parametern Java Basics - Anfänger-Themen 7
J Befehle aus anderen Klassen ausführen Java Basics - Anfänger-Themen 8
L Ausführen von Methoden Java Basics - Anfänger-Themen 4
S Datei ausführen, verschiedene Ordner Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben