你好,我在运行程序时每隔几秒钟就会有一次随机闪烁,它有一个图像在屏幕上移动。我使用Graphics paint()方法,并在线程的run()方法中使用repait()。以下是代码的相关部分,如果需要,我会发布整个代码。顺便说一句,典当是一个装满典当对象的数组列表,最初我有5个线程用于5个图像的移动,但我只尝试了一个图像,它仍然闪烁,所以不是这样。
private BufferedImage helicopter;
helicopter = ImageIO.read(new File("white.png"));
public void paint(Graphics g) {
g.setColor(Color.WHITE);
g.fillRect(0, 0, this.getWidth(), this.getHeight());
for(count=0; count<pawns.size(); count++){
g.drawImage(helicopter, pawns.get(count).getX(), pawns.get(count).getY(), null);
}
g.setColor(Color.BLACK);
g.drawLine(350, 0, 350, 600);
}
public void run() {
while(true) {
randSleep = (int)(Math.random()*100);
randMove = (int)(Math.random()*2);
pawn.setX(pawn.getX()+randMove);
try{
Thread.sleep(40);
}
catch(Exception e) {
e.printStackTrace();
}
repaint();
}
}
对于具有复杂输出的组件,应使用只定义需要更新的矩形的参数,而不是而不是无arg版本,这会导致整个组件重新喷漆。
Swing对paint()的实现将调用分解为3个独立的回调:paintComponent()paintBorder()paint-Children()扩展的Swing组件,这些组件希望实现自己的绘制代码应该将此代码放在paintComponent()方法的范围内(不在paint()中)。
来源:AWT和Swing中的绘画:良好的绘画代码是应用程序性能的关键
您应该注意到,在引用和链接的源代码中,重新绘制()(没有参数)将调用update(),默认情况下,它会在绘制之前清除背景。我怀疑这是闪烁的来源,当组件在调用paint()之前被清除时。
如果您使用的是Swing组件,则不应实现自己的双缓冲,而应使用Swing提供的功能。
首先尝试使用参数调用重新绘制,以避免更新清除整个背景。或者为更新方法编写一个重写。如果这不能解决问题,那么接下来尝试将绘图代码放入Swing组件的paintComponent方法中。