我目前有一個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並不能解決問題。
任何想法如何完全消除閃爍?
你有沒有試過看這個:http://stackoverflow.com/q/669979/401667 – Molske