Java - 使用repaint()时闪烁

时间:2015-03-03 18:51:34

标签: java graphics repaint flicker

您好我在运行程序时每隔几秒钟就会出现随机闪烁,它会在屏幕上移动一个图像。我在线程的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();

         }
      }

1 个答案:

答案 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方法中。