Countdown Probleme

Status
Nicht offen für weitere Antworten.

Freeaak

Mitglied
Hallo!
Ich will so ein kleines Spiel programmieren, in dem man ein Zeitlimit hat, das in einem Textfeld angezeigt wird. Das Problem: Wenn der Countdown startet, ist das Feld auf 10, dann passiert 10 sec nichts und das feld ist auf 0. Wie kann ich die Zahlen dazwischen auch anzeigen lassen?
Code:
Thread countdown = new Thread();
for(int i = 0; i <= 10; i++)
            {
                try
                {
                    countdown.sleep(1000);
                }
                catch(InterruptedException e){
                } 
                jTextField1.setText(Integer.toString(10-i));
            }

Gruß

Freeaak
 
folgender code sollte dir weiterhelfen... das verhalten, was passieren soll, wenn der button gedrückt wird, während der countdown läuft, musst du anpassen...

Code:
package org.javaforum.y06.july.countdown;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;

public class CountDownTest extends JFrame implements ActionListener
{
	public static void main(String[] args)
	{
		new CountDownTest();
	}

	JLabel countdownLabel;
	JButton button;

	public CountDownTest()
	{
		Runnable createAndShowGui = new Runnable()
		{

			public void run()
			{
				setLayout(new BorderLayout());

				initComponents();

				pack();
				validate();
				setVisible(true);
			}

		};
		SwingUtilities.invokeLater(createAndShowGui);
	}

	public void actionPerformed(ActionEvent e)
	{
		// start the countdown-thread
		new CountdownThread(countdownLabel, button);
	}

	protected void initComponents()
	{
		// label
		countdownLabel = new JLabel("" + CountdownThread.TIME_IN_SECONDS);
		countdownLabel.setEnabled(false);
		add(countdownLabel, BorderLayout.CENTER);

		// button
		button = new JButton("Countdown!");
		button.addActionListener(this);
		add(button, BorderLayout.SOUTH);
	}
}

Code:
package org.javaforum.y06.july.countdown;

import javax.swing.JButton;
import javax.swing.JLabel;

public class CountdownThread extends Thread
{

	private JLabel label;
	public final static int TIME_IN_SECONDS = 10;
	private final JButton button;

	public CountdownThread(JLabel label, JButton button)
	{
		this.label = label;
		this.button = button;
		start();
	}

	@Override
	public void run()
	{
		// first, enable the button
		button.setEnabled(false);

		// start the countdown thing
		for (int time = TIME_IN_SECONDS; time >= 0; time--)
		{

			// update label
			label.setText("" + time);
			try
			{
				// wait a second
				Thread.sleep(1000);
			} catch (InterruptedException e)
			{
				e.printStackTrace();
			}
		}

		// finally reset the label and enable the button
		label.setText("" + TIME_IN_SECONDS);
		button.setEnabled(true);
	}

}
 
oha. von dem quelltext versteh ich weniger als die hälfte. wieso muss da so viel zugefügt werden, dass man gleichzeitig zu dem countdown noch was machen kann?

kann mir wer mal wer erklären, was das programm da anders macht als meins?
 
Freeaak hat gesagt.:
oha. von dem quelltext versteh ich weniger als die hälfte. wieso muss da so viel zugefügt werden
Weil Clemson zuviel des Guten gemacht hat. Mit ca. 10 Zeilen kommt man auch aus


Freeaak hat gesagt.:
kann mir wer mal wer erklären, was das programm da anders macht als meins?

Es startet (vermutlich, mir ist der Quelltext auch ein Wenig zu lang) den Countdown-Prozeß
in einem separatem Thread.

Ich könnte dir ein kleines Beispiel zusammenbasteln, weiß aber nicht ob deine
Frage überhaupt noch aktuell ist; immerhin sind bereits 2 Tage vergangen...
 
der vollständigkeit halber hir das gekürzte beispiel....

Code:
package org.javaforum.y06.july.countdown;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;

public class CountDownTest extends JFrame implements ActionListener
{
	public static void main(String[] args)
	{
		new CountDownTest();
	}

	JLabel countdownLabel;
	JButton button;

	public CountDownTest()
	{
		Runnable createAndShowGui = new Runnable()
		{

			public void run()
			{
				setLayout(new BorderLayout());

				initComponents();

				pack();
				validate();
				setVisible(true);
			}

		};
		SwingUtilities.invokeLater(createAndShowGui);
	}

	public void actionPerformed(ActionEvent e)
	{
		// define a new countdown thread and implement the countdown thing
		new Thread()
		{
			@Override
			public void run()
			{
				// do a for loop, counting from 10 down to 0
				for (int i = 10; i >= 0; i--)
				{
					// update the label's text
					countdownLabel.setText("T -" + i);
					try
					{
						// sleep 1 second
						Thread.sleep(1000);
					} catch (InterruptedException e)
					{
						e.printStackTrace();
					}
				}
			}
		}.start(); // start the thread...
	}

	protected void initComponents()
	{
		// label
		countdownLabel = new JLabel("" + CountdownThread.TIME_IN_SECONDS);
		countdownLabel.setEnabled(false);
		add(countdownLabel, BorderLayout.CENTER);

		// button
		button = new JButton("Countdown!");
		button.addActionListener(this);
		add(button, BorderLayout.SOUTH);
	}
}
 
Ist ja doch nicht so lang! 😎

Nur dein Coding-Style (öffnende geschweifte Klammern in separater Zeile)
und die Leerzeilen zwischen deinen Anweisungsgruppen lassen ihn
länger erscheinen.


Täusche ich mich oder hat dein new Thread() im actionPerformed
überhaupt kein new Runnable() ???:L
 
Leroy42 hat gesagt.:
Täusche ich mich oder hat dein new Thread() im actionPerformed
überhaupt kein new Runnable() ???:L

das is richtig - es wird die run() methode des threads überschrieben...

ist das falsch bzw. sollte man das nicht machen???
 
clemson hat gesagt.:
es wird die run() methode des threads überschrieben...

ist das falsch bzw. sollte man das nicht machen???

Oh sorry. Ist natürlich richtig.

Ich selbst übergebe halt im Konstruktor immer ein Runnable und habe
diese Art einen Thread zu definieren, ganz einfach vergessen. 😳
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben