Я пытаюсь нарисовать изображение каждые 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);
}
}
}