您好我在运行程序时每隔几秒钟就会出现随机闪烁,它会在屏幕上移动一个图像。我在线程的run()方法中使用了Graphics paint()方法和repaint()。以下是代码的相关部分,如有必要,我会发布完整代码。当然,典当是一个装有典当物品的arraylist,最初我有5个线程可以移动5个图像,但我只尝试了1个图像,它仍然闪烁,所以它不是那样。
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();
}
}
答案 0 :(得分:1)
在具有复杂输出的组件上,应调用repaint() 只定义需要更新的矩形的参数 比no-arg版本,导致整个组件 粉刷一新。
Swing的paint()实现将调用分为3个单独的 callbacks:paintComponent()paintBorder()paintChildren()扩展 希望实现自己的绘图代码的Swing组件 应该将此代码放在paintComponent()方法的范围内 (不在paint()中)。
source: Painting in AWT and Swing: Good Painting Code Is the Key to App Performance
你应该注意在引用和链接的源中,repaint()(没有参数)将调用update(),默认情况下在绘制之前清除背景。在调用paint()之前清除组件时,我怀疑这是闪烁的来源。
如果您使用Swing组件,则不应实现自己的双缓冲,而应使用Swing提供的功能。
首先尝试使用参数调用重绘以避免更新清除整个背景。或者为update方法写一个覆盖。如果这不能解决问题,请尝试将绘图代码放在Swing组件的paintComponent方法中。