2012-04-30 16 views
1

我有一個使用線程的Java程序。在我跑法,我有:用Java持續重繪

public void run() { 
    while(thread != null){ 
     repaint(); 
     System.out.println("hi"); 
     try { 
      Thread.sleep(1000); 
     } catch (InterruptedException e) { 
      break; 
     } 
    } 
} 

public void paintComponent(Graphics g) { 
    // painting stuff 
} 

的問題是執行run方法,但paintComponent部分不叫。如果這不是繼續重新繪製組件的正確方法,那麼我應該如何重新繪製它?

+1

這是擴展'JComponent'類的代碼塊嗎? (因爲'paintComponent()'是一個'JComponent'方法)。 – cgull

+4

請向我們展示體面格式化的真實代碼。您當前的代碼表明,paintComponent在* run()方法內,並且不能爲true。再次,編輯您的問題,儘可能清理您的代碼併發布有意義的代碼,您當前使用的代碼,並向我們提供有關您的問題的更多詳細信息。假設我們不知道任何關於未顯示的代碼,並且我們無法讀懂你的想法。 –

+0

試試這個[示例](http://stackoverflow.com/a/10352884/1057230),希望這可能會有所幫助:-) –

回答

0

您必須爲諸如JFrame等重量較大的容器調用paint(g)。你可以爲像JButton這樣的輕量級容器調用paintComponent(g)。看看是否有效。

3

您應該只在需要時重新繪製組件(即更新它時)。

+0

但是在遊戲中,我需要不斷更新屏幕。 – Anonymous181

+2

當您更新內容或使用時鐘時觸發重繪。沒有「持續」重新繪畫的東西。 –

+0

@ Anonymous181如果沒有更改,則無需更新屏幕。每當你更新遊戲狀態時,你應該告訴你的組件重新繪製自己。 – Jeffrey

5

Cal from a Swing Timer。這不會阻塞GUI,並且會以定時器中指定的任何間隔發生。當然,由於Swing/AWT繪畫的本質,如果定時器設置爲重複太快,則調用繪畫可能會合並(有效忽略)。

此外,還要確保該方法使用替代:

@Override 
public void paintComponent(Graphics g){ 
1

取決於你在做什麼,你可能也有興趣在此。這取自安德魯戴維森的Killer Game Programming in Java。他談到積極渲染。你的遊戲循環實際上是:

public void run() 
{ 
    while (running) 
    { 
    gameUpdate();        // game state is updated 
    gameRender();        // render to a buffer 
    paintScreen();       // draw buffer to screen 

    try 
    { 
     Thread.sleep(20); 
    } 
    catch (InterruptedException e) {;} 
    } 
} 

而且,油漆屏幕的實現(通過JComponent一個子類中定義):

private void paintScreen() 
{ 
    final Graphics2D g2d; 

    try 
    { 
    g2d = (Graphics2D) this.getGraphics(); 
    if (g2d != null && (backbuffer != null)) 
    { 
     g2d.drawImage(backbuffer, 0, 0, null); 
    } 

    Toolkit.getDefaultToolkit().sync();  // sync the display on some systems [1] 
    g2d.dispose(); 
    } 
    catch (Exception e) 
    { 
    ; 
    } 
} 

從書:

[注1]致電Tookkit.sync()可確保顯示屏及時更新。這是Linux所必需的,它不會自動刷新其顯示緩衝區。如果沒有sync()調用,動畫可能只會部分更新,從而產生「撕裂」效果。