2014-04-27 52 views
0

我已經搜索了這個問題,但每個人似乎都有圖形更新太慢的問題。Java圖形更新太快

介紹我的情況:

我有一個JFrame,我設置爲全屏,使用兼容的顯示模式。 在JFrame中我有幾個JPanel和JButtons ...... 在JPanels之一中,我繪製了需要更新的移動對象。

我正在像這樣更新圖形:驗證並重新繪製JFrame,然後重新驗證並重新繪製相應的JPanel。 圖形更新太快。 (我需要提到的是在JPanel上,我重寫了paintComponent方法)。 我試圖在JFrame上使用BufferStrategy,但這會阻止我顯示JPanel和JButton(不知道爲什麼)。

我也會把這個oppurtunity問一些你們,如果你可以明確區分paint,validate,repaint,revalidate,invalidate等......所有的教程幾乎都沒有抓表面。

+0

你只需要重新驗證時,一個組件作爲被添加/從其父中移除。它與繪畫無關。請解釋你正在嘗試做什麼,並展示一個嘗試或至少你到目前爲止的內容 –

+1

你能解釋爲什麼你認爲它的更新速度太快嗎? – FelixM

+0

我認爲它更新速度過快的原因是因爲如果我使用通常定義的JFrame(新的JFrame,而不是全屏幕的顯示模式),它正常工作(我有一些球在labirint中移動)。代碼如下所示: void rollBalls(){ f.validate(); f.repaint(); updateBallsSpecs(); p.revalidate(); p.repaint();} f是JFrame,p是JFrame中的JPanel。更新規範方法只是更新球的規格(數組中的座標),我在JPanel類的paintComponent方法中使用的座標。 – user3577465

回答

0

「的計時機制很簡單,就是利用System.timeCurrentMillis5分鐘運行來算,一個循環」

這是行不通的。如果沒有延遲,循環最終會阻止繪畫發生,直到循環完成。

我建議你看看動畫使用javax.swing.Timer。你可以看到更多在How to Use Swing Timers

Timer的基本結構如下所示

Timer (int delayInMillis, ActionListener listener) 

其中delayInMillis是毫秒之間拖延時間「滴答」listener提供actionPerformed這就是所謂的每delayInMillis毫秒。所以,最後你做這樣的事情

Timer timer = new Timer (40, new ActionListener(){ 
    public void actionPerformed(ActionEvent e) { 
     for (Ball ball: balls) { 
      ball.move(); 
      repaint(); 
     } 
    } 
}); 

你可以看到一個完整的例子here

enter image description here

+0

非常感謝,但是我應該在哪個JFrame中的JFrame或JPanel上調用repaint? – user3577465

+0

如果您在面板上繪畫,請在面板上調用重新繪製。看到我鏈接的例子 –

+0

謝謝你的作品。我更新了JFrame或Jpanel,因爲它們是相同的(Jpanel是我的JFrame的一個孩子),我只是在FPS方面失去了一點。 – user3577465