Cóż, poniższy kod pokazuje JFrame z JTextArea i JButton. Po kliknięciu przycisków, licznik przesyła zdarzenie wielokrotnie (z drugim opóźnieniem między nimi) do parametru actionListener związanego z przyciskiem, który dodaje linię do bieżącego czasu.
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Calendar;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextArea;
import javax.swing.Timer;
public class TimerTest extends JFrame implements ActionListener{
private static final long serialVersionUID = 7416567620110237028L;
JTextArea area;
Timer timer;
int count; // Counts the number of sendings done by the timer
boolean running; // Indicates if the timer is started (true) or stopped (false)
public TimerTest() {
super("Test");
setBounds(30,30,500,500);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setLayout(null);
area = new JTextArea();
area.setBounds(0, 0, 500, 400);
add(area);
JButton button = new JButton("Click Me!");
button.addActionListener(this);
button.setBounds(200, 400, 100, 40);
add(button);
// Initialization of the timer. 1 second delay and this class as ActionListener
timer = new Timer(1000, this);
timer.setRepeats(true); // Send events until someone stops it
count = 0; // in the beginning, 0 events sended by timer
running = false;
System.out.println(timer.isRepeats());
setVisible(true); // Shows the frame
}
public void actionPerformed(ActionEvent e) {
if (! running) {
timer.start();
running = true;
}
// Writing the current time and increasing the cont times
area.append(Calendar.getInstance().getTime().toString()+"\n");
count++;
if (count == 10) {
timer.stop();
count = 0;
running = false;
}
}
public static void main(String[] args) {
// Executing the frame with its Timer
new TimerTest();
}
}
Ten kod jest próbką użycia obiektów javax.swig.Timer. W odniesieniu do konkretnego przypadku pytania. Instrukcja if, aby zatrzymać stoper musi się zmienić, i oczywiście działania akcji zostały wykonane.Poniższy fragment jest szkielet rozwiązania actionPerformed:
public void actionPerformed(ActionEvent e) {
if (e.getComponent() == myDealerComponent()) {
// I do this if statement because the actionPerformed can treat more components
if (! running) {
timer.start();
runnig = true;
}
// Hit a card if it must be hitted
switch (getJBTable(JB.total, JB.aces > 0)) {
case 0:
JB.hit();
break;
case 1:
break done;
case 2:
JB.hit();
JB.bet *= 2;
break done;
}
if (JB.total >= 21) { // In this case we don't need count the number of times, only check the JB.total 21 reached
timer.stop()
running = false;
}
}
}
IMHO to rozwiąże problem, teraz @ user920769 musi myśleć gdzie umieścić ActionListener i/warunki WY¸ÑCZANIE Uruchamianie ...
@kleopatra: Dzięki dla pokazania mi istnienia tej klasy czasomierza, nic o niej nie wiem i to jest niesamowite, sprawić, że wiele zadań do aplikacji do swinga :)
Dziękuję bardzo za przykład, ale dostaję błąd na tych liniach: timer = new Timer (1000, this); timer.setRepeats (true); Mówiąc, że nie może znaleźć odpowiedniego konstruktora lub metody, odpowiednio. Czy były przestarzałe? – Fractaly
Czy importujesz klasę Timer? Metody nie są przestarzałe nawet w ostatnim wydaniu, dlatego wydaje się, że popełniłeś błąd. [Tutaj apiDoc Java7] (http://download.oracle.com/javase/7/docs/api/javax/swing/Timer.html) – Charliemops