2014-04-27 51 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