Swing: анимация все еще заикается, когда я использую Toolkit.getDefaultToolkit (). Sync (); - PullRequest
0 голосов
/ 31 августа 2018

Я пытаюсь нарисовать изображение каждые 100 мс, используя Thread.sleep (). Но я слышал, что при использовании Thread.sleep () с swing он движется как заикание. поэтому я добавляю код Toolkit.getDefaultToolkit (). sync (), но он все равно выглядит как заикание.

Правильно говоря, это выглядит как задержка, как 2 ~ 300 мс, и рисует сразу с коротким временем.

Я имею в виду, когда я хочу переместить изображение, я хочу выглядеть как

рисовать - спать - рисовать - спать - ...

но похоже на

рисовать - спать - спать - спать - рисовать - рисовать - рисовать - спать - ...

Мне жаль, что мои объяснения плохи, я бы хотел, чтобы вы это поняли.

А вот и мой код.

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._buffer.

И нарисуйте _buffer для _panel в методе Draw, после этого вызовите Toolkit.getDefaultToolkit (). Sync ().

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);
         }
     }
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...