Java Swing:当我使用Toolkit.getDefaultToolkit().sync()时,动画仍然会结巴;

Java Swing:当我使用Toolkit.getDefaultToolkit().sync()时,动画仍然会结巴;,java,swing,animation,synchronization,Java,Swing,Animation,Synchronization,我尝试使用Thread.sleep()每100毫秒绘制一次图像。但我听说当使用Thread.sleep()和swing时,它会像口吃一样移动。所以我添加了代码Toolkit.getDefaultToolkit().sync(),但它看起来仍然像是口吃 正确地说,它看起来像是延迟2~300ms,并在短时间内立即绘制 我的意思是当我想移动图像时,我希望看起来像 画-睡-画-睡 但是看起来 画-睡-睡-睡-画-画-画-睡 对不起,我解释得太差了,我希望你能理解这一点 这是我的密码 public abs

我尝试使用Thread.sleep()每100毫秒绘制一次图像。但我听说当使用Thread.sleep()和swing时,它会像口吃一样移动。所以我添加了代码Toolkit.getDefaultToolkit().sync(),但它看起来仍然像是口吃

正确地说,它看起来像是延迟2~300ms,并在短时间内立即绘制

我的意思是当我想移动图像时,我希望看起来像

画-睡-画-睡

但是看起来

画-睡-睡-睡-画-画-画-睡

对不起,我解释得太差了,我希望你能理解这一点

这是我的密码

public abstract class EngineViewer implements Runnable
{
     private int _frameInterval = 100;
     private CameraInterface _camera;

     private Canvas _canvas;

     public EngineViewer(int displayWidth, int displayHeight, int resolutionWidth, int resolutionHeight)
     {
         Thread thread = new Thread(this);
         thread.start();
     }

     private void Sleep()
     {
         try { Thread.sleep(_frameInterval); }
         catch(Exception e) { }
     }


     @Override
     public void run()
     {
         while(true)
         {
             Clear();

             _camera.Draw(_canvas);

             Draw();

             Sleep();
         }
     }

     protected abstract void Draw();
}
将摄像头注册到EngineViewer,EngineViewer每次调用camera.Draw()。 摄像头将图像绘制到从SwingViewer获取的缓冲区。\u缓冲区

并在调用Toolkit.getDefaultToolkit().sync()之后,将_缓冲区绘制到draw方法的_面板


不需要while循环和Thread.sleep()。而是使用摆动计时器来安排动画。有关更多信息,请阅读上的Swing教程部分。此外,方法名称不应以大写字符开头。@camickr还有其他方法使用Thread.sleep()吗?@MadProgrammer很抱歉,这是什么意思。我想你是说选择swing paint system或bufferstrategy,但我不明白这到底是什么意思。你能用一些例子更详细地解释一下吗@신승빈 ; ;
public class SwingViewer extends EngineViewer
 {       
     private JFrame _frame;

     private SWPanel _panel;

     private BufferedImage _buffer;
     private Graphics2D _graphic;

     public SwingViewer(String name, int displayWidth, int displayHeight, int resolutionWidth, int resolutionHeight)
     {
         super(displayWidth, displayHeight, resolutionWidth, resolutionHeight);

         _frame = new JFrame(name);
         _frame.setSize(displayWidth, displayHeight);
         _frame.setVisible(true);
         _frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

         _panel = new SWPanel();
         _frame.add(_panel);
     }

     @Override
     public void Draw()
     {
         if(_panel != null)
             _panel.Draw();

         Toolkit.getDefaultToolkit().sync();
     }

     private class SWPanel extends JPanel
     {
         private static final long serialVersionUID = 1;

         private void Draw()
         {
             repaint();
         }

         @Override
         public void paintComponent(Graphics g)
         {
             super.paintComponent(g);

             g.drawImage(_buffer, 0, 0, EngineViewer.DisplayWidth(), EngineViewer.DisplayHeight(), null);
         }
     }
 }