Ich versuche, ein Timer-basiertes Punktesystem für eine Puzzle-Anwendung zu implementieren, die ich gerade schreibe.
Kann mir jemand ein Beispiel für die Erstellung eines JLabel oder Panel in Swing geben, das einen sichtbar zählenden Timer (in Sekunden von 0) enthält, der bei einem Aufruf von einer Methode anhält. Und seinen Wert zurückgibt.
Beispiel:
Stunden:Minuten:Sekunden [00:00:00] [00:00:01] usw.. überschreibt den vorherigen Eintrag.
Gracias
EDIT: Dies ist eine Anpassung des von trashgod verlinkten Beispielcodes: ClockExample
, die einfache if-Anweisungen verwendet, um Stunden, Minuten und Sekunden anzuzeigen...
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.JToggleButton;
import javax.swing.Timer;
/** @see https://stackoverflow.com/questions/5528939*/
class ClockExample extends JFrame {
private static final int N = 60;
private static final String stop = "Stop";
private static final String start = "Start";
private final ClockListener cl = new ClockListener();
private final Timer t = new Timer(1000, cl);
private final JTextField tf = new JTextField(8);
public ClockExample() {
t.setInitialDelay(0);
JPanel panel = new JPanel();
tf.setHorizontalAlignment(JTextField.RIGHT);
tf.setEditable(false);
panel.add(tf);
final JToggleButton b = new JToggleButton(stop);
b.addItemListener(new ItemListener() {
@Override
public void itemStateChanged(ItemEvent e) {
if (b.isSelected()) {
t.stop();
b.setText(start);
} else {
t.start();
b.setText(stop);
}
}
});
panel.add(b);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.add(panel);
this.setTitle("Timer");
this.pack();
this.setLocationRelativeTo(null);
this.setVisible(true);
}
public void start() {
t.start();
}
private class ClockListener implements ActionListener {
private int hours;
private int minutes;
private int seconds;
private String hour;
private String minute;
private String second;
@Override
public void actionPerformed(ActionEvent e) {
NumberFormat formatter = new DecimalFormat("00");
if (seconds == N) {
seconds = 00;
minutes++;
}
if (minutes == N) {
minutes = 00;
hours++;
}
hour = formatter.format(hours);
minute = formatter.format(minutes);
second = formatter.format(seconds);
tf.setText(String.valueOf(hour + ":" + minute + ":" + second));
seconds++;
}
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
ClockExample clock = new ClockExample();
clock.start();
}
});
}
}
Nochmals vielen Dank an alle!
3 Stimmen
Ich denke, Sie sollten sich den Swing Timer ansehen ( download.oracle.com/javase/6/docs/api/index.html?javax/swing/ ). Sie kann verwendet werden, um eine Aktion periodisch auszulösen, bis sie gestoppt wird.
1 Stimmen
Schauen Sie sich das mal an Beispiel .
0 Stimmen
Hier ist eine weitere wichtige Beispiel .
1 Stimmen
@Jay: Nachdem du dir diese Beispiele angesehen hast, kannst du deinen Codeversuch hier posten und wir können dir dabei helfen.
1 Stimmen
Okay! Danke für die Beispiele, ich werde mir das jetzt mal ansehen!
1 Stimmen
@Jay: Ausgezeichnet. Das erste Beispiel ist ein wenig abstrus; éste vielleicht etwas klarer.
1 Stimmen
@trashgod: AH dieses Beispiel ist ein wenig nützlicher! Danke für den Link! Mit diesem Beispiel versuche ich gerade, die Inkrementierung von Minuten und Stunden sowie Sekunden zu bewirken. hast du irgendwelche Vorschläge, wie man das machen könnte? danke
4 Stimmen
@Jay: Gut gemacht! Ich denke, Ihre Verwendung von
DecimalFormat
ist eine gute Wahl. Ich würde Sie bitten, das Beispiel in eine Antwort zu verschieben.