我给frame加了个背景图片,调用super.paint(g)后可以显示出来,但是因为后面我又用了个双缓冲图片offScreen来
画别的内容,这样程序运行的时候屏幕就不断的闪烁,貌似是刷过一边背景后又刷一遍缓冲图片,导致闪烁。
该怎么办呢? public void paint(Graphics g) {
super.paint(g); if (offScreenImage == null) {
offScreenImage = this.createImage(1000,800);
}
Graphics gOffScreen = offScreenImage.getGraphics();
Color c = gOffScreen.getColor();
gOffScreen.setColor(Color.white);
gOffScreen.fillRect(0, 0, 1000, 800);
gOffScreen.setColor(c); for (int i = 0; i < birds.size(); i++) {
birds.get(i).draw(gOffScreen);//这里把一只只鸟画出来
}
g.drawImage(offScreenImage, 0, 0, null);
}

解决方案 »

  1.   


    不去掉,就移动到
    g.drawImage(offScreenImage, 0, 0, null);
    前面不过,反正super.paint的效果会被g.drawImage覆盖,加上的话,纯属浪费执行时间真正想留,也是把super.paint放在最后一句,但不知道你具体画了什么东西,所以也不敢猜测现象
      

  2.   


    呵呵,我最开始也这样认为,但是出现过很郁闷的问题,最后查了一下资料,上面是这样说的,
    "
    有经验的程序员会发现,一些函数在覆写父类函数时必须要 super 一下,但是有时候不经意间忘记调用 super 对应的函数。在 AWT/Swing 的众多代码中,事件处理都要依赖于这些事件处理函数,在事件处理函数被覆写之后,一旦有人忘记 super 就会破坏底层的事件处理流程,有时后果会相当严重,其中的一个缺陷就是引起内存泄漏,这种缺陷引起的内存泄漏问题可能很多年也定位不了,曾经有些同事抱怨 Sun 的代码经常引起内存泄漏,多数情况下都是使用不正确引起的。"
      

  3.   

    建议使用双缓冲    paint  repaint  update
      

  4.   


    背景怎么做双缓冲处理呢,我是在JFrame的初始函数里添加的背景代码,如下: URL url1 = urlload.findResource("Images/background.jpg");
    Image img1 = Toolkit.getDefaultToolkit().getImage(url1);
    backgroundLabel = new JLabel(new ImageIcon(img1));
    this.getLayeredPane().add(backgroundLabel, new Integer(Integer.MIN_VALUE));
    backgroundLabel.setBounds(0,0,800,600);
    ((JPanel)getContentPane()).setOpaque(false);
    setVisible(true);我在paint()里面用双缓冲画的是一些活动的图片,不知道背景和它怎样结合起来?
      

  5.   

    好了,解决了!谢谢各位了
    我在paint()双缓冲里同时把背景图片也draw出来,就可以了
    原来想狭隘了,老想着得把背景图片放到label里显示...