我们在
设计java图形程序的时候(注意,不是GUI程序,是用java来画图的程序,也就是 说调用了publicvoid paint(Graphics g)方法的
程序。 第一个问题,画出来的程序不会动。通常采用的解决方法是加入新的线程内部类,通过此内 部类去访问包装类的repaint()方法,从而不停地重画该界面,实现我们能看到的动的效 果。
privateclassPaintThreadimplements Runnable { publicvoid run() { while(true) { repaint(); try { Thread.sleep(100); } catch (InterruptedException e) { e.printStackTrace(); } } } }
注意,这里使用的是内部类,才能调用外部包装类的repaint()方法。 第二个
问题,闪烁现象。 主要是和线程的睡眠时间有关,睡眠时间越短,闪烁显现就越严重。是因为显示器的刷新频 率高于程序。paint方法还没有来得及画完整幅画面,所以就出现了闪烁问题。 解决办法就是将使用双缓冲消除,先把所有东西画在虚拟屏幕上,前面什么都不画,然后一 次性把画好的内容显示出来。 在java的图形当中,repaint()首先调用update() ,然后update()会调用paint() 。 因为paint()是不可以改的,repaint()是用来调用的。我们只能在update()上做文章。 第一步:需要用到一张虚拟的图片
Image offScreenImage = null; //虚拟图片 第二步,重写update()方法。 (注,update是container的方法。 ) publicvoid update(Graphics g) { if(offScreenImage == null) { offScreenImage = this.createImage(800, 600); } Graphics gOffScreen = offScreenImage.getGraphics(); Color c = gOffScreen.getColor(); gOffScreen.setColor(Color.GREEN); gOffScreen.fillRect(0, 0, 800, 600); gOffScreen.setColor(c);
paint(gOffScreen);
g.drawImage(offScreenImage, 0, 0, null);
}