打字游戏之主界面实现

目录及源码链接https://blog.csdn.net/coolyuan/article/details/107169180

效果展示:

在这里插入图片描述

实现方法:

1.窗口添加背景图

窗口添加背景图实现方法

2.打字游戏标题的自动下落

标题的自动下落其实上也是打字游戏的精髓代码之所在,只要理解了如何实现标题下落,那么数字下落问题也可如法炮制。
实现标题自动下落的本质实际上就是将标题画在一个画布上,然后擦掉标题,修改标题位置后再次重绘,只要反复重绘的速度够快,就形成了标题在自动下落的感觉。
实现方法是新建一个JPanel的子类(为了实现重绘)并且实现runnable接口(等等为了新建一个线程,让标题下落和其他的任务可以并发执行)

/*在一个面板上实现标题自动下落*/
class Title extends JPanel implements Runnable {
    int width = 500;
    int height = 250;
    int N = 4;
    int[] x = new int[N];//存储标题中的每个字的横坐标
    int[] y = new int[N];//存储标题中的每个字的纵坐标
    String[] strs = new String[]{"打", "字", "游", "戏"};

    Title() {

        setBounds(0, 0, width, height);//设置面板大小
        setOpaque(false);//透明
        setplace();//设置标题每个字初始的横纵坐标
    }

    void setplace() {
        for (int i = 0; i < N; i++) {
            x[i] = (int) (width * 0.15 + i * 0.2 * width);
            y[i] = 10;
        }
    }

    @Override
    public void paint(Graphics g) {
        super.paint(g);
        g.setColor(Color.RED);//设置画笔颜色为红
        g.setFont(new Font("方正姚体", Font.PLAIN, 50));//设置画笔字体
        for (int i = 0; i < N; i++) {
            g.drawString(strs[i], x[i], y[i]);//在指定位置画出标题的字
            y[i]++;//标题的字纵坐标下移一像素
            if (y[i] > height - 50) {//如果到达height-50,则保持在那个位置
                y[i] = height - 50;
            }
        }

    }

    @Override
    public void run() {
        while (true) {
            try {
                Thread.sleep(10);//实现每10毫秒重绘一次
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            repaint();//调用重绘函数
        }
    }
}

然后再主窗口添加该标题面板,并启动线程

Title title = new Title();//新建一个标题对象
            this.add(title);//往窗口中加入标题面板
            Thread t = new Thread(title);//将标题面板加入一个线程
            t.start();//启动线程,实现标题面板下落

3.鼠标进入按钮范围内自动圈起

本人嫌弃JButton太丑,因此用JLabel代替,圈起的实现只需要给每个JLabel添加鼠标适配器,当鼠标
进入JLabel区域时,重写 mouseEntered方法,给JLabel添加边框,重写mouseExited方法,设置JLabel无边框,如:

 exitjb.addMouseListener(new MouseAdapter() {
                @Override
                public void mouseClicked(MouseEvent e) {
                    System.exit(0);
                }

                public void mouseEntered(MouseEvent e) {
                    exitjb.setBorder(BorderFactory.createMatteBorder(2, 2, 2, 2, Color.LIGHT_GRAY));
                }

                @Override
                public void mouseExited(MouseEvent e) {
                    exitjb.setBorder(null);
                }
            });


ps:被老师问过 MouseAdapter()这块东西是什么,当初以为能new的应该就是个普通的类,结果打脸了。
Ctrl+鼠标左键查看MouseAdapter,
在这里插入图片描述
知道了MouseAdapter是个抽象类,实现了MouseListener等接口,因此可以使用MouseAdapter的子类创建的对象做监视器,只需重写需要的接口方法即可。
new MouseAdapter()实际上就是new了一个继承了MouseAdapter抽象类的匿名内部类。

猜你喜欢

转载自blog.csdn.net/coolyuan/article/details/107116387