2011-11-22 100 views
2

我目前有一個JFrame,它在內容窗格上以60幀/秒的速度從遊戲循環中繪製圖像。這工作正常,但在右側,我現在有更多的Swing元素,我想在選擇內容窗格的某些部分時顯示一些信息。這部分是一個靜態GUI,並沒有使用遊戲循環。更新GUI會產生閃爍效果

我更新這樣說:

public class InfoPanel extends JPanel implements Runnable { 
    private String titelType = "type: "; 
    private String type; 
    private JLabel typeLabel; 
    private ImageIcon icon; 

    public void update() { 
     if (this.icon != null) 
      this.typeLabel.setIcon(this.icon); 

     if(this.type != null || this.type != "") 
      this.typeLabel.setText(this.titelType + this.type); 
     else 
      this.typeLabel.setText(""); 
    } 

    public void run() { 
     try { 
      Thread.sleep(150); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     this.update(); 
    } 

(當玩家實際上已經搬到這個方法只調用,所以它只是調用一次 - 每秒不是60次)

我注意到當從遊戲循環中調用update()方法時,我會得到閃爍的效果。我認爲這是因爲更新UI需要一些時間,所以我決定把它放在一個新的線程中。這減少了閃爍,但沒有解決它。

接下來,我決定給新線程設置低優先級,因爲每秒重繪60次的屏幕部分更爲重要。這再次減少了閃爍,但仍然發生。然後,我決定在調用update()方法之前在新線程中使用Thread.sleep(150);,這個方法完全解決了我係統上的閃爍效應。

但是,在其他系統上運行時,它仍然會發生。不像以前那樣頻繁(可能每20秒一次),但仍然非常煩人。可以看出,只是在另一個線程中更新UI並不能解決問題。

任何想法如何完全消除閃爍?

+0

你有沒有試過看這個:http://stackoverflow.com/q/669979/401667 – Molske

回答

4

調用update()SwingUtilities.invokeAndWait()它停止線程並更新EDT中的UI。

+0

那麼這是如何工作的?我真的不知道如何使用它... – Bv202

+0

您開始線程。當您需要在GUI中更改某些內容時,您可以調用SwingUtilities.invokeAndWait(您的代碼位於Runnable這裏) – StanislavL

+0

是的,但不可能從那裏調用該方法... – Bv202