2011-07-15 171 views
1

如何以客戶端顯示器的最大刷新率對JPanel進行動畫製作?Swing中的流暢動畫

我想要發生的是paintComponent只在上次更新後調用。我可以通過使用Timer來每隔(1000/60)ms計劃repaint(),但我只是猜測刷新率是多少。

實際上,我想連續調用repaint。但是如果我每秒鐘撥打repaint 200次,而且EDT不忙,它會每秒執行paintComponent 200次,這是對處理器時間的低效使用,並且可能會對應用程序的其他性能產生負面影響。

+0

這可能是脫離主題,但[RepaintManager'](http://download.oracle.com/javase/6/docs/api/javax/swing/RepaintManager.html)摺疊多個請求到對組件樹的成員進行一次重繪。 – mre

+0

你確定你確實想重繪()很多次嗎?你會在JPanel內的對象中發生那麼多的變化嗎?或者你正在考慮將它移動到內部進行動畫,就像遊戲一樣? – woliveirajr

+0

您是否無法確定何時需要重新繪製? – Perception

回答

2

我不確定在顯示器刷新率重繪是一個好主意。但是,如果你正在尋找刷新率是什麼,你可以使用這段代碼(無恥地從互聯網上覆制)。

GraphicsEnvironment ge = GraphicsEnvironment 
     .getLocalGraphicsEnvironment(); 
GraphicsDevice[] gs = ge.getScreenDevices(); 

for (int i = 0; i < gs.length; i++) { 
    DisplayMode dm = gs[i].getDisplayMode(); 

    // Get refresh rate in Hz 
    int refreshRate = dm.getRefreshRate(); 
    if (refreshRate == DisplayMode.REFRESH_RATE_UNKNOWN) { 
     // Unknown rate 
    } else { 
     System.out.println(refreshRate); 
    } 
} 
+0

也許我真正想要做的是重新計算刷新率的動畫位置,而不是重新繪製自己,並觸發如有必要,重新繪製。 –

+0

我認爲這樣會很好。如果精靈的數量非常複雜,那麼你可以刷新任何最合適的fps。我會建議雙緩衝來儘可能平滑動畫。 – Perception

+0

我很確定這些天默認所有的Swing都是雙緩衝的 –

1

我與@little bunny foo foo同意,你必須與操作系統延遲計算過,這個值取決於HW & SW的,那麼我的WinXp下有大約63毫秒值,overlocking這個頻率你的RepaintManager得到錯誤,爲例如JTable是非常敏感的JComponents,請閱讀更多關於Swing的繪畫paintImmediately(),repaint()defalut創建EDT 看這裏painting and javax.swing.Timer