Threads Thread pausieren

Hi Leute,

ich bin gerade dabei ein kleines Spiel zu schreiben. Bisher habe ich 2 Klassen:
"Mastermind.java" und "Stoppuhr.java".

die Stoppuhr soll einfach die Zeit hochzählen im Format: m:s "00:00"

die Stoppuhrklasse sieht so aus:

Java:
public class Stoppuhr{

	private int m=0;
	private int s=0;
	private boolean stop;
	private boolean isRunning = false;
	private int zaehler;
	private long save = System.currentTimeMillis();
	private Zähler z = new Zähler();
	private boolean pause = false;
	
	public String getZeit(){
		if(m<10&&s<10)return("0"+m+":0"+s);
		else if(m<10&&s>10)return("0"+m+":"+s);
		else if(m>10&&s<10)return(""+m+":0"+s);
		else return(""+m+":"+s);
	}
	
	public void weiter(){
		stop = false;
	}
	
	public void stoppe(){
		stop = true;
	}
	
	public void pauseZähler(){
		pause = true;
	}
	
	public void resumeZähler(){
		pause = false;
	}
	
	public void starte(){
		z = new Zähler();
		z.start();
	}
	
	public boolean getPause(){
		return pause;
	}
	
	public boolean getStop(){
		return stop;
	}
	
	class Zähler extends Thread{
	    public void run(){
	    	if(!isRunning){
	    		isRunning=true;
	    		stop = false;
	    		zeitSetzen();
	    		isRunning=false;
	       }
	    }
		public void zeitSetzen(){
			while(!stop){
				long tmp = System.currentTimeMillis();
				if(!pause){
					zaehler = (int)(tmp-save);
					m = zaehler/60000;
					s = (zaehler-(m*60000))/1000;
				}else{
					long tmp2 = save;
					save += tmp-tmp2;
				}
			}
		}
	}
}

und die Zeit soll mit in einer Swing-Oberfläche angezeigt werden:

Java:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import saufg24.Stoppuhr;

public class MasterMind extends JFrame{

        //.... verschieden Swing-Komponenten

	private JLabel zeit = new JLabel("00:00");
        private JMenuBar menuBar = new JMenuBar();
        private JLabel zeit = new JLabel("00:00");

	public static void main(String[] args){
		MasterMind gui = new MasterMind();
		gui.setVisible(true);
		gui.setLocationRelativeTo(null);
		gui.setDefaultCloseOperation(EXIT_ON_CLOSE);
	}
	
	public MasterMind(){
		super("MasterMind");
		zThread.start();
		
                setJMenuBar(menuBar);
		JMenu fileMenu = new JMenu("File");

		JMenuItem newGameItem = new JMenuItem("Neues Spiel");
		JMenuItem pauseGameItem = new JMenuItem("Pause");
		
		fileMenu.add(newGameItem);
		fileMenu.add(pauseGameItem);
		
		//Menu Items ActionListener		
        newGameItem.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
            	s = new Stoppuhr();
            	s.starte();
            	}});
		
        pauseGameItem.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
            	if(s.getPause()){
            		s.pauseZähler();
            	}
            	else if(!s.getPause()){
            		s.resumeZähler();
            	}
            }});
       //... anderer Code zur Zusamensetzung der Swing-Komponenten
	}
	
	class Zeit extends Thread{
		public void run(){
			while(true){
				zeit.setText(s.getZeit());
			}
		}
	}
}


Ich kann die Zeit zwar mit dem "newGameItem" starten aber das mit pause und resume funktioniert leider nicht.
Kann mir vielleicht jemand weiterhelfen und/oder Verbesserungsvorschläge machen?

Danke schon mal im Vorraus,

Mfg,
Helikoptermann
 
Zuletzt bearbeitet:

SleepProgger

Mitglied
Ich habe mal kurz eine TimerKlasse von mir angepasst.
Das ganze ist sicherlich noch nicht perfekt, du solltest damit aber was anfangen können.

GUI:
Java:
package mastermind;

	import javax.swing.*;
	import java.awt.*;
	import java.awt.event.*;
	import java.util.Observable;
	import java.util.Observer;
	 
	public class MasterMind extends JFrame implements SimpleCallback<Integer>{
	 
	        //.... verschieden Swing-Komponenten
		private Timer timer;
	    private JLabel zeit = new JLabel("00:00");
	 
	    public static void main(String[] args){
	        MasterMind gui = new MasterMind();
	        gui.setSize(500, 500);
	        gui.setLocationRelativeTo(null);
	        gui.setDefaultCloseOperation(EXIT_ON_CLOSE);
	        gui.setVisible(true);
	    }
	    
	    public MasterMind(){
	       super("MasterMind");
	       /* Benoetigt damit die anonymen Actionlistener Implementierungen zugriff haben */
	       final SimpleCallback<Integer> me = this;
	        
	        JButton newGameButton = new JButton("new Game");
	        newGameButton.addActionListener(new ActionListener() {
				@Override
				public void actionPerformed(ActionEvent e) {
	            	// Wenn der Timer schon gesetzt wurde beende ihn
					// Besser wäre es den Timer wieder zu verwenden (pausieren, Ticks zurücksetzen, starten)
	            	if(timer!= null){
	            		timer.finish();
	            	}
	                timer = new Timer(1000, 0);
	                timer.addObserver(me);
	                timer.start();
				}
			});

	        JButton pauseGameButton = new JButton("Pause");
	        pauseGameButton.addActionListener(new ActionListener() {
	        	@Override
	        	public void actionPerformed(ActionEvent e) {
	        		timer.triggerPause();
	        	}
	        });

	        this.setLayout(new FlowLayout());
	        this.add(zeit);
	        this.add(newGameButton);
	        this.add(pauseGameButton);
	        
	    }

		/* Nimmt die Aufrufe vom Timer entgegen */
		@Override
		public void update(Integer sekunden) {
			zeit.setText((int)(sekunden/60) + ":" + (sekunden%60));	
		}
	}

Timer:
Java:
package mastermind;

import java.util.ArrayList;
import java.util.List;
import java.util.Observable;
import java.util.Observer;


public class Timer extends Thread{
	/* Liste mit den registrierten "Observer" Klassen */ 
	private List<SimpleCallback<Integer>> myObserver;
	private int sleepTime;
	private int ticks;
	private boolean run; 
	private int loops;
	private boolean pause;
	
	public Timer(int sleepTime, int loops) {
		myObserver = new ArrayList<SimpleCallback<Integer>>();
		this.sleepTime = sleepTime;
		ticks = 0;
		run = false;
		this.loops = loops;
		pause = false;
	}
	
	/**
	 * Hier meldet man sich an wenn man von dem Timer benachrichtigt werden möchte
	 * @param observer
	 */
	public void addObserver(SimpleCallback<Integer> observer){
		myObserver.add(observer);
	}
	public int getTicks() {
		return ticks;
	}
	/**
	 * Zum beenden
	 */
	public void finish(){
		run = false;
	}
	/**
	 * Zum pausieren
	 */
	public void pause(){
		pause = true;
	}
	/**
	 * Zum neustarten nach einer Pause
	 */
	public void restart(){
		pause = false;
	}
	/**
	 * Zum triggern des Pause status
	 */
	public void triggerPause(){
		pause = !pause;
	}
	
	@Override
	public void run() {
		run = true;
		while (run && !isInterrupted() && (loops == 0 ||(loops != 0 && loops > ticks))) {
			if(!pause){
				ticks++;
				/* Durchlaufe alle registrierten Klassen und benachrichtige sie */
				/* Damit die Bearbeitung in der Callbackmethode die Zeit nicht beinflusst rufe sie in einem Thread auf */
				for (final SimpleCallback<Integer> callback : myObserver) {
					new Thread(new Runnable() {
						@Override
						public void run() {
							callback.update(ticks);	
						}
					}).start();
				}
				
				try {
					Thread.sleep(sleepTime);
				} catch (InterruptedException e) {
					run = false;
				}
			/* Wenn pausiert warte 100 ms um den Prozy zu schonen */
			}else{
				try {
					Thread.sleep(100);
				} catch (InterruptedException e) {
					run = false;
				}
			}
		}
		
	}
	
}

SimpleCallback: (Dient der Entkopplung)
Java:
package mastermind;

public interface SimpleCallback <T>{
	public void update(T object);
}
 
Zuletzt bearbeitet:

tagedieb

Top Contributor
:shock: Du solltest mal deine Conditions und Berechnungen ueberpruefen.

Nach Java NamingConventionen benutzt man fuer die getter-Methoden fuer boolean nicht den
Code:
get
sonder
Code:
is
Prefix. Dann macht der Code auch gleich mehr Sinn. Auch Sonderzeichen wie ä ö und ü sollte man in Klassen und Methoden vermeiden. Ausserdem brauchst du hier kein if-else-if sondern ein einfaches if-else Statement reicht!


Java:
		pauseGameItem.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				if (s.isPause()) {
					s.resumeZähler();
				} else {
					s.pauseZähler();
				}
			}
		});


Auch Multithreading sollest du mal nachlesen. Stichwort synchronized.

Du brauchst nur einen Thread zum updaten des GUI. bzw, des Timers.
Aus dem Zeit-Thread rufst du die
Code:
zeitSetzen()
Methode direkt auf. Oder noch besser du rufst die Methode indirekt aus der
Code:
getZeit
Methode auf. Am Schluss rufst du noch
Code:
zeit.repaint();
auf damit die Zeit im GUI aktualisiert wird.

Ausserdem solltest du nach jedem update den Thread fuer eine Sekunde zum Schlafen schicken ansonsten treibst du bloss den CPU Auslastung in die Hoehe.

Auch deine Berechnung fuer die Pausierung ist irgendwie falsch:
Java:
	long tmp2 = save;
	save += tmp - tmp2;
 
Erst einmal vielen Dank für eure hilfreichen Beitrage.

Inzwischen habe ich die get/is Methode umbenannt bzw durch eine triggerPause Methode ersetzt.
Die Berechnung für die Pausierung werde ich mir nochmal anschauen.
Leider habe ich bis jetzt noch nicht viel (fast gar nicht) mit Thread gearbeitet, weil ich mir das erst vor Kurzem angeschaut habe. Deshalb kann ich auch nicht viel mit deiner Hilfestellung anfangen. Aber ich werde mich mit Multithreading beschäftigen.

Mfg
 

Volvagia

Top Contributor
Ich würde statt der boolean einen byte als Status festlegen. z.B. NOT_STARTED_STATE = -128;, RUNNING_STATE = NOT_STARTED_STATE + 1;. WAITING_STATE = RUNNING_STATE + 1;, DYING_STATE = WAITING_STATE + 1;, DEAD_STATE = DYING_STATE + 1;
Das erleichtert das Umbauen, wenn du mehr als 2 Stati brauchst. Denn wenn du keine Katze programmierst, wird kaum ein Objekt 2 Stati gleichzeitig haben. ;)
Durch die verkettete Liste kannst du einen Status bequem reinschieben, ohne alles danach wie bei einen Array anpassen zu müssen, nur einen davor und danach.

Um zu pausieren würde ich folgendes vorschlagen:

Java:
private static final Object WAIT_MONITOR = new Object();

...
private static final byte WAITING_STATE = RUNNING_STATE + 1;
private static final byte DYING_STATE = WAITING_STATE + 1;
private static final byte DEAD_STATE = DYING_STATE + 1;

private byte state;

public void run()
{
	state = WAITING_STATE;

	do
	{
		switch(state)
		{
			...
			case(WAITING_STATE):
				synchronized(WAIT_MONITOR)
				{
					wait();
				}
			break;
		}
	}
	while(state != DYING_STATE);
	state = DEAD_STATE;
}
public void setState(byte newState)
{
	state = newState;
	synchronized(WAIT_MONITOR)
	{
		notifyAll();
	}
}
public void byte getState()
{
	return(state);
}

Da die Benutztung am Anfang aber ein wenig schwierig ist, wäre das vielleicht besser geeignet. Könnte womöglich auch den Statuswechsel beschleunigen, aber hab nie gemessen ob es da einen (vermutlich sehr sehr geringen) merkbaren Unterschied gibt.

Java:
...
private static final byte WAITING_STATE = RUNNING_STATE + 1;
private static final byte DYING_STATE = WAITING_STATE + 1;
private static final byte DEAD_STATE = DYING_STATE + 1;

private byte state;
private Thread thisThread;

public void run()
{
	state = WAITING_STATE;
	thisThread = Thread.currentThread();

	do
	{
		switch(state)
		{
			...
			case(WAITING_STATE):
				try
				{
					TimeUnit.DAYS.sleep(1L);
				}
				catch(InterruptedException e)
				{
					Thread.interrupted();
				}
			break;
		}
	}
	while(state != DYING_STATE);
	state = DEAD_STATE;
}
public void setState(byte newState)
{
	state = newState;
	thisThread.interrupt();
}
public void byte getState()
{
	return(state);
}
 
Weil ich nicht gewusst habe, wie ich von der Klasse "Stoppuhr" die Methode update() von "MasterMind" aufrufen kann habe ich die klasse jetzt in MasterMind integriert...

Wie hätte ich das mit der externen Klasse "Stoppuhr" lösen können?

Java:
package saufg24;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class MasterMind extends JFrame{
	
	private String sName;
	
	//Allgemeines Panel
	private JPanel spielPanel = new JPanel(new BorderLayout());
	
	//Menu
	private JMenuBar menuBar = new JMenuBar();
	
	//Zeit
	private Stoppuhr sUhr= new Stoppuhr();
	private Thread t1 = new Thread(sUhr);
	
	//Popup Erg
	private JFrame ergFrame = new JFrame("Highscore");
	private JDialog ergDialog = new JDialog();
	private JTable ergTable = new JTable();
	
	//Status-Labels 
	private JLabel name = new JLabel("Name");
	private JLabel zeit = new JLabel(sUhr.getZeit());
	
	//Spiel
	private JButton[][] btn4Gewinnt = new JButton[7][6];
	
	public static void main(String[] args){
		MasterMind gui = new MasterMind();
		gui.setVisible(true);
		gui.setLocationRelativeTo(null);
		gui.setDefaultCloseOperation(EXIT_ON_CLOSE);
	}
	
	public MasterMind(){
		super("MasterMind");
		//Namen abfragen und setzen
		Object me = this;
		do{
			sName = JOptionPane.showInputDialog(null,"Geben Sie Ihren Namen ein","Namensabfrage",JOptionPane.PLAIN_MESSAGE);
		}while(sName==null || sName.isEmpty());
		name.setText(sName);
		
		//Menubar
		setJMenuBar(menuBar);
		JMenu fileMenu = new JMenu("File");
		JMenu settingsMenu = new JMenu("Settings");
		JMenu helpMenu = new JMenu("?");
		
		menuBar.add(fileMenu);
		menuBar.add(settingsMenu);
		menuBar.add(helpMenu);
		
		JMenuItem newGameItem = new JMenuItem("Neues Spiel");
		JMenuItem pauseGameItem = new JMenuItem("Pause");
		JMenuItem highscoreItem = new JMenuItem("Highscore");
		JMenuItem aboutItem = new JMenuItem("About");
		JMenuItem rulesItem = new JMenuItem("Spielregeln");
		JMenuItem exitItem = new JMenuItem("Exit");
		
		JCheckBox beginCB = new JCheckBox("Beginnen");
		JCheckBox colorCB = new JCheckBox("Farbe: rot");
		
		fileMenu.add(newGameItem);
		fileMenu.add(pauseGameItem);
		fileMenu.add(highscoreItem);
		fileMenu.add(exitItem);
		
		settingsMenu.add(beginCB);
		settingsMenu.add(colorCB);
		
		helpMenu.add(rulesItem);
		helpMenu.add(aboutItem);
		
		
		//Menu Items ActionListener		
        newGameItem.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
            	if(sUhr.isRunning) sUhr.stoppe();
            	sUhr= new Stoppuhr();
            	t1 = new Thread(sUhr);
            	t1.start();
            	}});
		
        pauseGameItem.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
            	sUhr.triggerPause();
            }});
        
        highscoreItem.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
            	ergDialog.setVisible(true);
                ergDialog.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
            }});
        
		exitItem.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
            	System.exit(0);
            }
        });
		
		
		//JPanel Gridlayout Spiel 7,7
		JPanel spiel = new JPanel();
		spiel.setLayout(new GridLayout(7,6));
		
		//Spiel erstellen		
		
		//JPanel Boxlayout Status
		JPanel status = new JPanel();
		status.setLayout(new BorderLayout());
		status.add(name,BorderLayout.WEST);
		status.add(zeit,BorderLayout.EAST);
		
		//Zusammensetzen zu spiel panel
		spielPanel.add(spiel,BorderLayout.CENTER);
		spielPanel.add(status,BorderLayout.SOUTH);
		
		//zu Hauptfenster
		getContentPane().add(spielPanel);
		this.setSize(500,500);
		
		//ergpanel
    	ergDialog.setSize(200,400);
    	ergDialog.setLocationRelativeTo(null);
    	ergDialog.isAlwaysOnTop();
    	ergDialog.add(ergTable);
	}
	
	public void update() {
		zeit.setText(sUhr.getZeit()); 
	}
	
	
	//ZEIT:
	
	class Stoppuhr implements Runnable{
		private int m=0;
		private int s=0;
		public boolean isRunning = false;
		private int zaehler;
		private long save = System.currentTimeMillis();
		private boolean pause;
		private boolean run;
		
		public String getZeit(){
			if(m<10&&s<10)return("0"+m+":0"+s);
			else if(m<10&&s>10)return("0"+m+":"+s);
			else if(m>10&&s<10)return(""+m+":0"+s);
			else return(""+m+":"+s);
		}
		
		
		public void stoppe(){
			run = false;
		}
		
		public void triggerPause(){
			pause = !pause;
		}
		
		public void calcZeit(){
			while(run){
				long tmp = System.currentTimeMillis();
				if(!pause){
					zaehler = (int)(tmp-save);
					m = zaehler/60000;
					s = (zaehler-(m*60000))/1000;
					update();
				}else{
					save = tmp - (zaehler+1);
				}
			}
		}
		
		public void run(){
	    	if(!isRunning){
	    		isRunning=true;
	    		run = true;
	    		calcZeit();
	    		isRunning=false;
	       }
	    }
	}
}
 

tagedieb

Top Contributor
Hier ist mal mein Vorschlag. Du brauchst eigentlich nur einen Thread, der die ganze Arbeit macht. z.B. Zeit aktualisieren, die Position von Spieler und Gegnern neu berechnet, Kollisionen aufspuert und merkt wann das Spiel zu Ende ist. Zugegeben dies passt eher zu einen 2D-Jump-And-Run, aber auch wenn man es nur fuer kleinere Sachen braucht wie den Timer aktualisieren, das Pattern bleibt doch dasselbe.


Sieh dir mal das 2D-Spiele-Tutorial an:http://www.java-forum.org/spiele-multimedia-programmierung/6529-tutorials.html


Java:
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.concurrent.TimeUnit;

import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTable;

public class MasterMind extends JFrame {

	private String sName;

	// Allgemeines Panel
	private JPanel spielPanel = new JPanel(new BorderLayout());

	// Menu
	private JMenuBar menuBar = new JMenuBar();

	// Zeit
	private Stoppuhr sUhr = new Stoppuhr();

	// Popup Erg
	private JFrame ergFrame = new JFrame("Highscore");
	private JDialog ergDialog = new JDialog();
	private JTable ergTable = new JTable();

	// Status-Labels
	private JLabel name = new JLabel("Name");
	private JLabel zeit = new JLabel(sUhr.getZeit());

	// Spiel
	private JButton[][] btn4Gewinnt = new JButton[7][6];

	public static void main(String[] args) {
		MasterMind gui = new MasterMind();
		gui.setVisible(true);
		gui.setLocationRelativeTo(null);
		gui.setDefaultCloseOperation(EXIT_ON_CLOSE);
	}

	public MasterMind() {
		super("MasterMind");
		// Namen abfragen und setzen
		Object me = this;
		do {
			sName = JOptionPane.showInputDialog(null,
					"Geben Sie Ihren Namen ein", "Namensabfrage",
					JOptionPane.PLAIN_MESSAGE);
		} while (sName == null || sName.isEmpty());
		name.setText(sName);

		// Menubar
		setJMenuBar(menuBar);
		JMenu fileMenu = new JMenu("File");
		JMenu settingsMenu = new JMenu("Settings");
		JMenu helpMenu = new JMenu("?");

		menuBar.add(fileMenu);
		menuBar.add(settingsMenu);
		menuBar.add(helpMenu);

		JMenuItem newGameItem = new JMenuItem("Neues Spiel");
		JMenuItem pauseGameItem = new JMenuItem("Pause");
		JMenuItem highscoreItem = new JMenuItem("Highscore");
		JMenuItem aboutItem = new JMenuItem("About");
		JMenuItem rulesItem = new JMenuItem("Spielregeln");
		JMenuItem exitItem = new JMenuItem("Exit");

		JCheckBox beginCB = new JCheckBox("Beginnen");
		JCheckBox colorCB = new JCheckBox("Farbe: rot");

		fileMenu.add(newGameItem);
		fileMenu.add(pauseGameItem);
		fileMenu.add(highscoreItem);
		fileMenu.add(exitItem);

		settingsMenu.add(beginCB);
		settingsMenu.add(colorCB);

		helpMenu.add(rulesItem);
		helpMenu.add(aboutItem);

		// Menu Items ActionListener
		newGameItem.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				sUhr.resetAndStart();
			}
		});

		pauseGameItem.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				sUhr.triggerPause();
			}
		});

		highscoreItem.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				ergDialog.setVisible(true);
				ergDialog.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
			}
		});

		exitItem.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				System.exit(0);
			}
		});

		// JPanel Gridlayout Spiel 7,7
		JPanel spiel = new JPanel();
		spiel.setLayout(new GridLayout(7, 6));

		// Spiel erstellen

		// JPanel Boxlayout Status
		JPanel status = new JPanel();
		status.setLayout(new BorderLayout());
		status.add(name, BorderLayout.WEST);
		status.add(zeit, BorderLayout.EAST);

		// Zusammensetzen zu spiel panel
		spielPanel.add(spiel, BorderLayout.CENTER);
		spielPanel.add(status, BorderLayout.SOUTH);

		// zu Hauptfenster
		getContentPane().add(spielPanel);
		this.setSize(500, 500);

		// ergpanel
		ergDialog.setSize(200, 400);
		ergDialog.setLocationRelativeTo(null);
		ergDialog.isAlwaysOnTop();
		ergDialog.add(ergTable);

		new GamesThread().start();
	}

	public void update() {
		zeit.setText(sUhr.getZeit());
	}

	class GamesThread extends Thread {
		@Override
		public void run() {
			while (true) {
				update();
				try {
					Thread.sleep(50l);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
	}

	// ZEIT:

	class Stoppuhr {
		private long save, elapsedTime;
		private boolean pause = true;
		private NumberFormat format = new DecimalFormat("00");

		public String getZeit() {
			long currentTime = calcZeit();
			long seconds = TimeUnit.NANOSECONDS.toSeconds(currentTime);
			return format.format(seconds / 60) + ":"
					+ format.format(seconds % 60);
		}

		public void resetAndStart() {
			pause = false;
			save = System.nanoTime();
			elapsedTime = 0l;
		}

		public void triggerPause() {
			pause = !pause;
			if (!pause) {
				save = System.nanoTime();
			} else {
				elapsedTime += System.nanoTime() - save;
			}
		}

		public long calcZeit() {
			if (!pause) {
				return System.nanoTime() - save + elapsedTime;
			}
			return elapsedTime;
		}

	}
}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
CptK For-Schleife in Thread nach jedem Durchlauf pausieren Java Basics - Anfänger-Themen 35
G Schleife mit Thread.sleep pausieren Java Basics - Anfänger-Themen 12
Leyla Thread isInterrupt Java Basics - Anfänger-Themen 18
P Meldung aus Java-Klasse in Thread an aufrufende Klasse Java Basics - Anfänger-Themen 1
A Thread XML-Dateien zusammenfügen Java Basics - Anfänger-Themen 11
F influxdb Upload in eigenem Thread Java Basics - Anfänger-Themen 2
frager2345 Thread - Methoden synchronized deklarieren Java Basics - Anfänger-Themen 10
berserkerdq2 Größter unterschied von extends thread und implements runnable? Java Basics - Anfänger-Themen 2
T Thread beenden aus zweiter Klasse Java Basics - Anfänger-Themen 4
A Thread - Synchronized Java Basics - Anfänger-Themen 10
A Thread Producer - Consumer Java Basics - Anfänger-Themen 1
A Thread-Semhapore Java Basics - Anfänger-Themen 0
A Thread Exchanger Java Basics - Anfänger-Themen 22
A Thread-Cyclicbarrier Java Basics - Anfänger-Themen 4
B In einem Thread Endlosschleife beenden Java Basics - Anfänger-Themen 19
A Thread-Verklemmung Java Basics - Anfänger-Themen 10
A Thread-Schreibe-Lese-Problem Java Basics - Anfänger-Themen 4
A Thread find number Java Basics - Anfänger-Themen 8
F Thread.sleep() Java Basics - Anfänger-Themen 5
F Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 11 at main.main(main.java:11) Java Basics - Anfänger-Themen 2
A Thread Java Basics - Anfänger-Themen 3
M Exception in thread "main" java.util.NoSuchElementException Java Basics - Anfänger-Themen 2
A Thread Java Basics - Anfänger-Themen 8
B Compiler-Fehler Fehlermeldung Exception in thread, falsche Eingabewert Java Basics - Anfänger-Themen 2
M Thread-Zustände Java Basics - Anfänger-Themen 6
S Kriege Fehler "Exception in thread" beim Benutzen von SubStrings. Java Basics - Anfänger-Themen 2
B Endlosschleife Thread sauber beenden Java Basics - Anfänger-Themen 19
D Java Thread wartet nur ein mal Java Basics - Anfänger-Themen 1
D Java Thread wartet nur ein mal Java Basics - Anfänger-Themen 0
O Exception in thread "main" java.lang.ArithmeticException: / by zero Java Basics - Anfänger-Themen 4
C Thread und TimerTask, Verstädnisproblem Java Basics - Anfänger-Themen 10
amgadalghabra Sorting Thread Launcher Java Basics - Anfänger-Themen 3
B Exception in thread "AWT-EventQueue-0" java.util.ConcurrentModificationException Java Basics - Anfänger-Themen 8
A Thread Java Basics - Anfänger-Themen 4
A Thread Java Basics - Anfänger-Themen 1
A Thread Java Basics - Anfänger-Themen 0
R Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException Java Basics - Anfänger-Themen 5
S Compiler-Fehler Exception in thread "main" java.lang.Error: Unresolved compilation problem: Java Basics - Anfänger-Themen 6
L Liste in anderem Thread laden Java Basics - Anfänger-Themen 1
B Thread / Prozess stoppen? Java Basics - Anfänger-Themen 22
I Compiler-Fehler Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5 Java Basics - Anfänger-Themen 3
B Threads Thread sleep() Method einfache Frage Java Basics - Anfänger-Themen 8
W Thread Aufgabe - Vorgehensweise Java Basics - Anfänger-Themen 8
L Liste in anderem Thread laden Java Basics - Anfänger-Themen 0
J Threads PrograssBar update während thread Java Basics - Anfänger-Themen 13
D Compiler-Fehler Wert auf Datenbank übertragen und Sleep Thread Java Basics - Anfänger-Themen 3
Spencer Reid JavaFX Memory Thread.sleep Java Basics - Anfänger-Themen 1
S Thread.sleep mit JProgressBar Java Basics - Anfänger-Themen 1
ralfb1105 Frage zu Thread Synchronisation mit wait() und notify() Java Basics - Anfänger-Themen 3
R Exception in thread "main" java.lang.NullPointerException Java Basics - Anfänger-Themen 10
J JavaFX -> SocketIO -> Thread -> Update Label Java Basics - Anfänger-Themen 13
J Thread Handling Java Basics - Anfänger-Themen 9
A Problem mit Thread.sleep Java Basics - Anfänger-Themen 4
C Thread in Methode + raus aus der Schleife Java Basics - Anfänger-Themen 10
E Threads Thread in While-Schleife nur einmal starten Java Basics - Anfänger-Themen 2
F Daten von Thread an den aufrufenden zurückgeben Java Basics - Anfänger-Themen 22
C Compiler-Fehler Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 2 Java Basics - Anfänger-Themen 3
B Thread Problem Java Basics - Anfänger-Themen 7
N KeyListener in Thread Java Basics - Anfänger-Themen 0
M Thread.sleep() Funktion Java Basics - Anfänger-Themen 1
W JLabel in Main aus Thread verändern. Java Basics - Anfänger-Themen 4
D Ausgeben welcher Thread gerade Arbeitet Java Basics - Anfänger-Themen 8
N Threads Thread-Fehler Java Basics - Anfänger-Themen 2
F Thread um Uhrzeit ausführen Java Basics - Anfänger-Themen 5
F Get/Post als eigener Thread mit Rückgabe Java Basics - Anfänger-Themen 5
J Exception in thread "main" Java Basics - Anfänger-Themen 1
F Thread der auf eine Queue wartet, sicher beenden Java Basics - Anfänger-Themen 4
B Animation mit Thread(s) Java Basics - Anfänger-Themen 23
I Thread.sleep (1000); Java Basics - Anfänger-Themen 1
M Threads Jede Klasse einem Thread zuweisen Java Basics - Anfänger-Themen 7
J Java Thread cancel() und wiederbeleben Java Basics - Anfänger-Themen 4
J BouncingBalls 1 Thread Java Basics - Anfänger-Themen 3
L Fehler: Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException Java Basics - Anfänger-Themen 4
J Timer oder Thread programmieren ? Java Basics - Anfänger-Themen 10
fLooojava Laufender Thread | Boolean ändern Java Basics - Anfänger-Themen 9
T Thread Pool mit Work Stealing Java Basics - Anfänger-Themen 1
R Java Thread Java Basics - Anfänger-Themen 10
J Welche Methoden laufen im neuen thread ?? Java Basics - Anfänger-Themen 9
S Java memory fehler: Exception in thread "AWT-EventQueue-0" java.lang.OutOfMemoryError: Java heap spa Java Basics - Anfänger-Themen 5
K Thread - Methoden in die run Methode Schreiben Java Basics - Anfänger-Themen 5
N Threads Exception in thread "main"... Feher bei dem Versuch ein Radius zu berechnen Java Basics - Anfänger-Themen 4
A Code läuft nicht, Fehlermeldung Exception in thread "main" java.lang.Error: Unresolved compilation " Java Basics - Anfänger-Themen 11
V Threads Exception in Thread behandeln Java Basics - Anfänger-Themen 3
S Methoden Multi-Thread und Methoden Objects. Java Basics - Anfänger-Themen 1
J Thread erstellen (BlueJ Projekt) Java Basics - Anfänger-Themen 3
P Exception in thread "main" java.lang.NoClassDefFoundError: Java Basics - Anfänger-Themen 1
F Threads Variable aus einem Thread in main Methode? Java Basics - Anfänger-Themen 9
K Exception in thread "main" Java Basics - Anfänger-Themen 7
L Thread-Frage Java Basics - Anfänger-Themen 2
E Was ist ein idle-thread? Java Basics - Anfänger-Themen 1
D Exception in thread "AWT-EventQueue-0" Java Basics - Anfänger-Themen 8
J Threads Prozess in Thread auslagern Java Basics - Anfänger-Themen 2
G Thread mehrmals starten und schliessen Java Basics - Anfänger-Themen 6
F Thread Koordination (Vorteile/Nachteile) Java Basics - Anfänger-Themen 0
O Thread aus dem Thread stoppen Java Basics - Anfänger-Themen 6
O Swingworker/Thread Java Basics - Anfänger-Themen 3
R Focus auf JPanel im Thread Java Basics - Anfänger-Themen 9
S musik in eigenem thread Java Basics - Anfänger-Themen 2
A Klasse,Vererbung,Interface,Singleton,Thread Java Basics - Anfänger-Themen 5
IngoF GUI mit Thread Daten austauschen. Java Basics - Anfänger-Themen 6

Ähnliche Java Themen

Neue Themen


Oben