2015-07-11 53 views
-1

所以我在挖掘一些舊的Java項目,我從來沒有完成,我掏出這個有史以來最好的項目這個小號碼。不斷在Java中檢查時間

enter image description here

這是一個桌面時鐘部件在Java編碼和它的作品,除了一件事完全沒有問題。我有它的方式檢查當前保持更新的時間是在一個循環中,並在幾秒鐘內循環「崩潰」,所以小部件不再獲得當前時間。

這是循環是如何構建的(縮小):

public class getCurrentTime { 
    public static void getTime() throws InterruptedException { 
     int hour = global.calendar.get(Calendar.HOUR); 
     int minute = global.calendar2.get(Calendar.MINUTE); 

     if(hour == 0) { 
      global.hour.setIcon(new ImageIcon("resources/hours/12.png")); 
     }else if(hour == 23) { 
      global.hour.setIcon(new ImageIcon("resources/hours/11.png")); 
     }else { 
      global.hour.setText("?"); 
     } 

     if(minute == 0) { 
      global.minute.setIcon(new ImageIcon("resources/minutes/00.png")); 
     }else if(minute == 59) { 
      global.minute.setIcon(new ImageIcon("resources/minutes/59.png")); 
     }else { 
      global.minute.setText("?"); 
     } 
     Thread.sleep(1000); 
     getTime(); 
    } 
} 

global是一類,我保持了我的大部分的變量(我知道它的怪異,這就像3年前,這是我用來寫我的程序的方式)。

所以我的主要問題是,有沒有一種方法可以防止循環「崩潰」?

提前致謝!

+5

循環不會崩潰。它可能會拋出異常。在這種情況下,閱讀異常消息和堆棧跟蹤會告訴你和我們,問題是什麼以及在哪裏。比猜測好得多。 –

+2

請發佈完整例外 – Karthik

+0

明天我必須發佈,上牀睡覺。 – xR34P3Rx

回答

1

Thread.sleep(1000);不會是一個不錯的選擇。您可以使用Timer。通過使用Timer,您可以定期安排任務。

Timer timer = new Timer(); 
    long interval = (1000) ; // 1 sec 

    timer.schedule(new TimerTask() { 
     public void run() { 
      //do your work; 
     } 
    }, 0, interval); 

如果要停止調度,你可以使用timer.cancel();

編輯:Fildor說我認爲內存是你的問題。使用定時器這樣,它應該可以解決你的問題。

+0

我剛剛有機會實施此解決方案。到目前爲止,它的進展很好,我只是想解決圖像重疊的另一個小問題。謝謝!我今晚晚些時候更新我的解決方案。 – xR34P3Rx

3

這不是一個循環,真的。這是一個遞歸調用。在每次遞歸中,都會分配更多的內存,所以在一段時間內內存不足。我想知道爲什麼這是幾秒鐘的問題,但無論如何。 嘗試使用計時器來安排gui更新。

編輯:你正在每個遞歸中創建一個新的ImageIcon。他們在記憶中可能相當大。也許他們是快速「崩潰」的原因。

除此之外,我建議堅持java命名約定。類名應以大寫字母開頭。

+1

如果不是循環,嚴格來說不是「迭代」,而是「遞歸」;) – hiergiltdiestfu

+0

絕對如此。修正@hiergiltdiestfu – Fildor

+0

Fildor,我猜你正在尋找的詞是'StackOverflowException',因爲這是一個無限遞歸。 – Tom

-1

您的問題的答案是 使用功能 的設置超時功能,您希望避免循環崩潰。 像:

setTimeout(function() { 
    // write the logic 
},1000); 
+2

Java,而不是JavaScript ... – Fildor

0

這是第一個解決方案

class clockUpdater implements Runnable { 

    @Override 
    public void run() { 
     Thread.sleep(WAIT_TILL_NEW_MINUTE); 
     while(true){ //a infinite loop  
     // the Swing call below must be queued onto the Swing event thread 
     SwingUtilities.invokeLater(new Runnable(){ 
     @Override 
     public void run() {    
      //your clock updating code here 
     } 
     }); 
     try { 
     Thread.sleep(1000*60);//you only need to update once after a minute 
     } catch (InterruptedException e) { 
     // .... 
     } 
    } 
    } 
} 

這是第二

class clockUpdater extends Thread{ 
    @Override 

     public void run(){ 
     Thread.sleep(WAIT_TILL_NEW_MINUTE); 
     while(true){ 
     try{ 
      //your update code here 
      Thread.sleep(60*1000)// 
      } 
      catch(Exception e){ 
       //.. 
      } 
     } 
     } 
    } 

注:你需要儘快啓動本作中,系統時間的微小變化。或者時鐘時間會落後。一旦程序啓動,請計算WAIT_TILL_NEW_MINUTE僅在需要時才更新