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