关于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)后闪烁问题解决了。

 

 

 

 

 

 

 

 

 

 

 

posted @ 2021-12-05 11:10  _xiuxiu  阅读(910)  评论(0)    收藏  举报