我们在设计java图形程序的时候(注意,不是GUI程序,是用java来画图的程序,也就是说调用了public void paint(Graphics g)方法的程序。
第一个问题, 画出来的程序不会动。通常采用的解决方法是加入新的线程内部类,通过此内部类去访问包装类的repaint()方法,从而不停地重画该界面,实现我们能看到的动的效果。
privateclass PaintThread implements 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()上做文章。
第一步:需要用到一张虚拟的图片
ImageoffScreenImage = 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);
}