2016-06-19 10 views
-2

Ich muss ein Programm schreiben, das einen Swing-Countdown-Timer verwendet, um etwas zu tun (in diesem Fall, drucken Sie eine Zeichenfolge in der Konsole). Es erhält die benötigten Verzögerungsinformationen von einem Spinner und führt den Code aus, wenn ich den Startknopf drücke. Wenn ich jedoch einen Wert in den Kreisel einfüge, wartet es nur zweimal so viele Sekunden und beendet den Lauf, ohne etwas auszudrucken.Java Swing-Timer macht nicht das, was ich will

private void StartActionPerformed(java.awt.event.ActionEvent evt) {          

    int x = (int) Spinner1.getValue() * 1000; 
    Timer TIMER = new Timer(x, new MyActionListener()); 

    TIMER.start(); 

    try { 
    Thread.sleep(x * 2); 

    } catch (InterruptedException e) { 
    } 

    TIMER.stop(); 
} 

class MyActionListener implements ActionListener { 

    public void actionPerformed(ActionEvent e) { 
    System.out.println("Something"); 
    } 

} 

Jede Hilfe würde sehr geschätzt werden!

+1

Für bessere und schnellere Hilfe, stellen Sie eine [MCVE] – STaefi

+1

Verwenden Sie eine logische und konsistente Form der Einrückung Code Zeilen und Blöcke. Die Einrückung soll den Codefluss leichter nachvollziehen lassen! –

+1

Was ist der Unsinn mit 'Thread.sleep (x * 2); –

Antwort

0

Das Problem ist, dass Sie sich selbst aussperren.

Mit

Thread.sleep(x * 2); 

Sie die EventDispatchThread blockieren, die Ihre Action laufen würde. Immer noch hält der Timer intern eine Markierung, dass die Zeitüberschreitung aufgetreten ist und dass er Ihren ActionListener zum nächstmöglichen Zeitpunkt ausführen sollte.

Aber

TIMER.stop(); 

wird das Zurücksetzen des TIMER, so dass die Benachrichtigung verloren.