countdown zähl problem

Status
Nicht offen für weitere Antworten.

Nao88

Bekanntes Mitglied
sooo das Programm ist erst am Anfang und deshalb zähle ich nur die Minuten😉
wenn ich es ausführ wird gar keine zeit gezählt und ich weiß nich warum .
Es kommt sofort “die zeit ist nicht rum “und darauf“ sofort die zeit ist rum“
Und eigentlich sollte häufiger die zeit ist nicht rum erscheinen


Fachklasse

Java:
import java.util.Date;
import java.text.SimpleDateFormat;

class countdown {
	int dauerminuten;

	void zalen() {
		int i1;
		SimpleDateFormat date1 = new SimpleDateFormat("mm");

		i1 = (int) Double.parseDouble(date1.format(new Date()));
		i1 = i1 + dauerminuten;

		for (int i2 = 0; i2 < i1; i2 = (int) Double.parseDouble(date1
				.format(new Date()))) {
			System.out.println("die zeit ist nicht rum");
		}
		System.out.println("die zeit ist rum");
	}

	public countdown(int dauerminuten) {
		dauerminuten = dauerminuten;

	}
}

Hauptklasse
Java:
import javax.swing.JOptionPane;

public class Haupt {
	public static void main(String[] args) {
		String b = JOptionPane.showInputDialog("Geben Sie die Zeit ein: ");
		int dauerminuten;
		dauerminuten = (int) Double.parseDouble(b);
		countdown r1 = new countdown(dauerminuten);
		r1.zalen();
	}

}
 
ich hab nen timer hier, der zählt einwandfrei die zeit bis zum eingeproggten zeitpunkt runter... (nur darunter nich so recht)

der funktioniert eig. über das runterzählen der millisekunden.
sprich: ich hab die ms jetzt und die ms die zu erreichen sind, der unterschied wird in sek, min, std umgerechnet... halt nur im positiven bereich.


Das Model:
Java:
import java.util.Date;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Observable;

import javax.swing.Timer;



public class Model extends Observable
{
	private Date current;
	private Date target;
	private Timer ticker;
	
	public Model()
	{
		Calendar cal = Calendar.getInstance(); 
		current = new Date();

/*
* hier wird das ziel datum/zeit eingestellt
*/
		target = new Date(109, 7, 1);
		target.setHours(12);
		target.setMinutes(44);
		ticker = new Timer(1000, new AL(this));
	}
	
	public void ticked()
	{
		current = new Date();
		setChanged();
		notifyObservers();
	}
	
	public Date getCurrent()
	{
		return current;
	}

	public Date getTarget()
	{
		return target;
	}

	public void startTicker()
	{
		ticker.start();
	}
	
	public void stopTicker()
	{
		ticker.stop();
	}
	
	private class AL implements ActionListener
	{
		private Model mdl;
		
		public AL(Model mdl)
		{
			this.mdl = mdl;
		}
				
		@Override
		public void actionPerformed(ActionEvent arg0)
		{
			mdl.ticked();
		}
	}
}


Die View, die das Model anzeigt:
Java:
import java.awt.Color;
import java.awt.Font;
import java.util.Observable;
import java.util.Observer;

import javax.swing.JLabel;
import javax.swing.JPanel;



public class View extends JPanel implements Observer
{
	private Model mdl;
	private JLabel lbl;
	
	public View(Model mdl)
	{
		this.mdl = mdl;
		lbl = new JLabel("", JLabel.CENTER);
		this.setLayout(null);

		this.setBackground(Color.BLACK);
		
		Color c = Color.red;
		lbl.setSize(300,100);
		lbl.setLocation(0, 0);
		lbl.setForeground(c);
		lbl.setBackground(Color.BLACK);
		
		lbl.setText(" ");
		
		this.add(lbl);
		this.setVisible(true);
	}

	public void zeigTimer()
	{
		long ms = mdl.getCurrent().getTime();
		long ms2 = mdl.getTarget().getTime();
		
		long sek = (ms2 / 1000) - (ms / 1000);
		long min = sek / 60;
		long std = min / 60;
		
		sek = sek - (min * 60);
		min = min - (std * 60);
		//std = std - ((std / 24) * 24);
		
		String s = "" + sek;
		String m = "" + min;
		
		if(sek < 10)
		{
			s = "0" + sek;
		}
		if(min < 10)
		{
			m = "0" + min;
		}
		
		lbl.setText("<html><h1><b>" + std + ":" + m + ":" + s + "");
		
	}
	
	@Override
	public void update(Observable arg0, Object arg1)
	{
		zeigTimer();
		repaint();		
	}
}


Das Applet
Java:
import javax.swing.JApplet;



public class Starter extends JApplet
{
	private Model mdl;
	private View vw;
	
	public void init()
	{
		mdl = new Model();
		vw = new View(mdl);
		mdl.addObserver(vw);
		this.setSize(300, 100);
		this.add(vw);
		this.setContentPane(vw);
		this.setVisible(true);
		mdl.startTicker();
	}
}
 
daas sieht ganz gut aus :toll: und funzt auch soweit aba ich weiß immer noch nicht was bei mir falsch ist ?????:L und deine Sache ist etwas dumm da weiter zu machen denn dich muss zum Schluss ein beeeep to einfügen der zum Schluss immer in kürzeren abstanden kommt😳
 
man könnte nen zweiten timer einbaun, der das piepen regelt un von sekunde zu sekunde schneller läuft ???:L

Model mit 2 Timern
Java:
import java.util.Date;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Observable;

import javax.swing.Timer;



public class Model extends Observable
{
	private Date current;
	private Date target;
	private Timer ticker;
	private Timer ticker2;
	
	public Model()
	{
		Calendar cal = Calendar.getInstance(); 
		current = new Date();
		target = new Date(109, 7, 1);

		target.setHours(12);
		target.setMinutes(44);
		ticker = new Timer(1000, new AL(this));
		ticker2 = new Timer(999, new AL(this));
	}
	
	public void ticked()
	{
		current = new Date();
		setChanged();
		notifyObservers();
	}
	
	public void ticked2()
	{
		current = new Date();
		//PIIIIEEEEP
		if(ticker2.getDelay() > 99)
		{
		      ticker2.setDelay(ticker2.getDelay() - 100);
		}
		setChanged();
		notifyObservers();
	}
	
	public Date getCurrent()
	{
		return current;
	}

	public Date getTarget()
	{
		return target;
	}

	public void startTicker()
	{
		ticker.start();
	}
	
	public void stopTicker()
	{
		ticker.stop();
	}

	public void startTicker2()
	{
		ticker2.start();
	}
	
	public void stopTicker2()
	{
		ticker2.stop();
	}
	
	
	private class AL implements ActionListener
	{
		private Model mdl;
		
		public AL(Model mdl)
		{
			this.mdl = mdl;
		}
				
		@Override
		public void actionPerformed(ActionEvent arg0)
		{
			Timer t = (Timer) arg0.getSource();
			if(t.getDelay() == 1000)
			{
				mdl.ticked();
			}
			else
			{
				mdl.ticked2();
			}

		}
	}
}

und in der view bei zeigTimer()
Java:
		if(std == 0 && min == 0 && sek <= 10)
		{
			mdl.startTicker2();
		}

nur weiß ich net ob das ganze in einem thread tut...
 
Zuletzt bearbeitet:
Mal abgesehen, dass Dein Timer ein ganz schon merkwürdiges Konstrukt ist, liegt der wesentliche Fehler hier:
Java:
public countdown(int dauerminuten) {
	dauerminuten = dauerminuten;
}
Du weist hier der Variablen dauerminuten, die nur im Konstruktur gilt, sich selbst zu. Richtig müsste es heissen
Code:
this.dauerminuten = dauerminuten;
Abgesehen davon, dass man Klassen und deren Konstruktoren groß schreibt, besteht bei Deinem Code die Gefahr einer endlos Schleife (bsp. es ist xx.59 Uhr der Anwender gibt 1min ein --> i1 = 60 und i2 bleibt für immer kleiner i1) Ausserdem erzeugst Du mit Deiner Schleife ständig Prozessorlast, man könnte z.B. Thread.sleep(...) in die Schleife einbauen um den Prozessor zwischendurch freizugeben.
 
Solche Fehler passieren leicht; man kann aber sie aber leichter vermeiden, wenn man final einsetzt:

Java:
class Countdown {
	final int dauerminuten;
 
	/* .. */
 
	public Countdown( int dauerminuten) {
		this.dauerminuten = dauerminuten;
	}
}

Wenn man hier das this vergisst, dann meckert der Compiler darüber, dass eine finale Variable unitialisiert bleibt.

Oder auch so:
Java:
class Countdown {
	int dauerminuten;
 
	/* .. */
 
	public Countdown( final int dauerminuten) {
		this.dauerminuten = dauerminuten;
	}
}
Wenn man hier das this vergisst, dann gibt es ebenfalls einen Compile-Fehler, denn dann würde ja versucht werden, eine finale Variable neu zu setzen.

Natürlich darf man auch beides kombinieren.
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben