Bene, il codice seguente mostra un JFrame con JTextArea e un JButton. Quando si fa clic sui pulsanti, il Timer invia l'evento ripetutamente (con un secondo ritardo tra di loro) all'actionListener relativo al pulsante che accoda una linea con l'ora corrente.
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();
}
}
Bene, questo codice è un esempio di come utilizzare gli oggetti javax.swig.Timer. In relazione al caso particolare della domanda. L'istruzione if per fermare il timer deve cambiare e, ovviamente, le azioni dell'actionPerformed.Il seguente frammento è uno scheletro della soluzione 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 ciò risolve il problema, ora @ user920769 deve pensare dove mettere l'ActionListener e le condizioni di partenza/arresto ...
@kleopatra: Grazie per avermi mostrato l'esistenza di questa classe di timer, non ne so nulla ed è incredibile, rendere possibili molte cose con compiti in un'applicazione swing :)
Grazie mille per l'esempio, ma sto ricevendo un errore su queste righe: timer = new Timer (1000, this); timer.setRepeats (true); Dicendo che non può trovare il costruttore o il metodo adatto, rispettivamente. Erano deprecati? – Fractaly
Importa la classe Timer? I metodi non sono deprecati anche nell'ultima versione, quindi sembra un tuo errore. [Qui Java ApiDoc] (http://download.oracle.com/javase/7/docs/api/javax/swing/Timer.html) – Charliemops