关于Java中swing.JFrame的屏幕闪烁问题
在飞机大战运行中,频频出现窗口闪烁问题,代码附下:
package PlayGame; import javax.swing.*; import java.awt.*; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; public class MyGameFrame extends JFrame { Image bg = GameUtil.getImage("images/背景.png"); Image planeImage = GameUtil.getImage("images/飞机.png"); Plane plane = new Plane(planeImage,250,250);//新建对象 接下来plane 就代表了 Plane类 //窗口绘制,自动被调用 不需要管他 ,g相当于一只画笔 @Override public void paint(Graphics g) { super.paint(g); g.drawImage(bg,0,0,null); //g.drawImage(planeImage,(int) planeX,(int) planeY,null); plane.drawSelf(g);//画飞机 } //内部类,多次重写窗口 class PaintThread extends Thread{ @Override public void run() { while(true){ repaint();//重画窗口 //System.out.println("窗口重画了一次,Paint Thread被调用的次数:"+(count++)); try { Thread.sleep(40); //1s=1000ms(毫秒),每40毫秒重画一次,一秒重画25次 } catch (InterruptedException e) { e.printStackTrace(); } } } } //初始化窗口 public void launchFrame(){ this.setTitle("飞机大战"); //窗口可视化 this.setVisible(true); //窗口大小 this.setSize(500,500); //窗口位置 this.setLocation(300,300); //窗口监视(关闭窗口,停止运行) this.addWindowListener(new WindowAdapter() { @Override public void windowClosing(WindowEvent e) { System.exit(0); } }); addKeyListener(new KeyMonitor());//监听键盘 new PaintThread().start(); //启动重画窗口的线程 } //键盘监视,看按下、抬起哪个键 class KeyMonitor extends KeyAdapter{ //按下哪个键,增加该键 @Override public void keyPressed(KeyEvent e) { plane.addDirection(e); } //抬起哪个键,就取消该键 @Override public void keyReleased(KeyEvent e) { plane.minusDirection(e); } } public static void main(String[] args) { MyGameFrame mFame = new MyGameFrame(); mFame.launchFrame(); //System.out.println("这是我用IDEA写的第一个程序"); } }
在swing中已经解决了双闪冲的问题,但是上段代码中依旧存在闪屏问题,分析代码中看到super.paint(g); 即为paint(g)函数会重绘图像,当加上super.paint(g),表示在原来图像的基础上,再画图。如果不加super.paint(g),重绘时,会将原有的绘制清空,再根据paing(g)函数绘制。注释掉 super.paint(g)后闪烁问题解决了。

浙公网安备 33010602011771号