2013-05-17 35 views
0

我正在爲我的工作開發Scoreboard Java應用程序。它使用MySQL存儲分數值,Java應用程序訪問它們並將它們顯示在投影儀上。到目前爲止,我已經設法使用Swing創建了一個Java應用程序。我使用jLabels顯示所有分數,以便在不完全重繪記分牌的情況下更新分數。Java - 從MySQL定期更新

現在,我需要讓記分牌定期更新。我試圖使用Thread.sleep,但我不知道如何中斷該線程。我需要中斷線程的原因是,如果要在配置面板上更改記分板上顯示的條目數,則必須重新繪製記分牌以顯示正確的數字。

當前sleep在代碼中正常工作,只要我不碰任何東西。但只要我改變ConfigPanel中的任何內容,就會出錯。


package au.thewebeditor.scoreboard.apps; 

import java.lang.*; 

public class Program { 
    private static Scoreboard sb; 
    private static ConfigPanel cp; 

    public Program(){ 
     sb = new Scoreboard(); 
     cp = new ConfigPanel(); 
    } 

    public static void redrawScoreboard() throws NullPointerException{ 

     try{ 
      sb.dispose(); 
     } catch (NullPointerException e){ 
      //DO NOTHING 
     } 
     sb = new Scoreboard(); 
     try { 
      cp.toFront(); 
     } catch (NullPointerException e) { 
      cp = new ConfigPanel(); 
     } 
     constUpdates(); 
    } 

    public static void showConfig(){ 
     cp.setVisible(true); 
     cp.toFront(); 
    } 

    public static void main(String[] arguments){ 
     new Program(); 
     constUpdates(); 
    } 

    private static void constUpdates() { 
     boolean go = true; 
     while (go){ 
      try { 
       Thread.sleep(5000); 
       Scoreboard.updateScores(); 
      } catch (InterruptedException e) { 
       //DO nothing 
      } 
     } 
    } 

} 

當connfiguration已經改變redrawScoreboard()被調用。

目前,redrawScoreboard被調用時,它只是在隊列中,而constUpdates保持計數到5000.如何中斷sleep,以便我可以重新繪製記分牌。 sleep甚至是最好的選擇嗎?或者我應該嘗試其他的東西?

+0

查看'javax.swing.Timer',只要你喜歡就可以'停止'。我還會檢查[Swing中的併發](http://docs.oracle.com/javase/tutorial/uiswing/concurrency/),因爲您還有一些潛在的EDT違規問題...... – MadProgrammer

回答

1
  1. 你有一個問題與Concurency in Swing,任何創建,更新,修改Swing GUI的必須Event Dispatch Thread做,也許原因包裹sb.dispose();到try - catch通過拋出NullPointerException

  2. Swing GUI的必須Initial Thread

  3. 沒有任何理由可以創建重新建立一個新的Top-Level Container每5。秒,再用JComponents加入contianer上的應用程序的START_UP

  4. 使用util.Timer調用SwingWorker

+0

謝謝所有的鏈接。我現在正在研究SwingWorker和Concurency。FTR,'updateScores'不會創建一個新的頂層容器(根據我對TLC的瞭解),它只是在所有這些漂亮的'JLabels'上執行'setText'。 – MowgliB

1

調用constUpdates取當前線程的把它放在一個無限循環。 如果配置UI正在調用它,它將使UI線程陷入無限循環。 只需在主函數中設置該循環即可。

如果你得到一個InteruptedException,你應該跳出循環,不要繼續。

您已經將靜態和非靜態事物混合在一起,嘗試使對象變爲arround。

如果您希望配置要求記分牌重繪,請將其傳遞給記分板,以便它可以直接調用重繪並保留輪詢。