2016-06-04 6 views
0

Ich versuche, eine Java-Anwendung, die Popup-Nachricht alle 2 Stunden zu machen, aber zum Testen Zweck habe ich die Zeit auf 2 Minuten verkürzt. das Problem ist, dass ich nicht die JPanel immer Popup, wenn die während Bedingung falsch ausgewertet wird .. hier ist der Code Ich verwende:Bearbeitungszeit in Java

 Calendar cal = Calendar.getInstance(); 
    Calendar cal2; 
    SimpleDateFormat ST = new SimpleDateFormat("HHmm"); 
    SimpleDateFormat CT; 
    String x = ST.format(cal.getTime()); 
    int StartT = Integer.parseInt(x); 
    StartT= StartT+2; 
    int CurrentT; 
    //System.out.println(x2); 
    do{ 
     cal2 = Calendar.getInstance(); 
     CT = new SimpleDateFormat("HHmm"); 
     String y = ST.format(cal2.getTime()); 
     CurrentT = Integer.parseInt(y); 
    }while(CurrentT < StartT); 
JOptionPane.showMessageDialog(null, "MSG_Text.."); 
+1

Verwenden Sie eine logische und konsistente Form der Einrückung von Codezeilen und Blöcken. Die Einrückung soll den Codefluss leichter nachvollziehen lassen! –

Antwort

2

Sie das Rad nicht neu erfinden Verwendung eine Timer Klasse für sie und mit einer festen Rate die Aufgabe planen ...

Beispiel:

public static void main(String[] args){ 
    Timer t = new Timer("testTimer", true); 
    t.scheduleAtFixedRate(new TimerTask() { 
    @Override 
    public void run() { 
     System.out.println("hello world"); 
     JOptionPane.showMessageDialog(null, "MSG_Text..");  
    } 
    }, 0L, TimeUnit.SECONDS.toMillis(30)); //run will be invoked every 30 seconds 
    while (true) { 

     } 
    } 
+0

Ich bekomme einen Fehler sagt, dass Timer-Konstruktor nicht akzeptiert eine Zeichenfolge und einen booleschen Wert – Maryam

+0

dann verwenden Sie den falschen Timer ... Sie müssen die java.util.Timer verwenden; –

+1

* "Dann benutzt du den falschen Timer ..." * Du bist es auch. Die Verwendung von 'javax.swing.Timer' stellt sicher, dass alle Aufrufe von GUI-Komponenten auf dem EDT ausgeführt werden. –

-1

Haben Sie davon gehört: Thread#sleep(long millis)

Thread.sleep(2 * 60 * 1000) 

Dies ist viel besser als aktive warten (Weil es weniger CPU-Leistung benötigt).

Wenn Sie nur an einer besonderen Zeit ausführen müssen, wie 10: 15: 00.000 Sie können dies mit Hilfe einstellen

long timeToWait = nextExecutionTIme - System.currentTimeMillis() + 1; 
Thread.sleep(timeToWait); 

EDIT:

while (true) { 
    Thread.sleep(2 * 60 * 1000) 
    JOptionPane.showMessageDialog(null, "MSG_Text.."); 
} 
+0

dann wie kann ich das JPanel popup? – Maryam

0

Haben Sie versucht, nach Ihrer Do-While-Schleife eine System.out zu setzen, um zu sehen, ob Ihr Code die Schleife überhaupt beendet?


Dieser Kalender/SimpleDateFormat/foo Zeug tut mir wirklich weh!

  1. Es ist aktiv warten/beschäftigt warten. Es kostet viel CPU-Leistung. Fleißiges Warten ist ein Hauptgrund für den Klimawandel! Tu das nicht! (https://en.wikipedia.org/wiki/Busy_waiting)

  2. Verwenden Sie Thread.sleep. 1 Zeile, viel kürzer, einfacher, weniger fehleranfällig, kostet fast keine CPU-Leistung.


Java bietet einen riesigen Rahmen für fast alles. Es gibt APIs für Schlafen/Warten/Zeitberechnungen/etc.

Bauen Sie nicht Ihre eigenen. Es gab viele Leute, die das JDK entwarfen, den Code auf Fehler prüften und es einfach zu benutzen machten.

+1

Ich stimme zu: es tut wirklich weh –

0

Ich denke, Sie sollten Timertask verwenden, die besser ist als diese eigene Funktion Auch wird es nicht mehr ausgeführt, wenn es 2359 die letzte Minute des Tages erreichen wird.