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));
}
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?
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...
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