打字游戏之主界面实现

    技术2024-08-17  67

    目录及源码链接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抽象类的匿名内部类。

    Processed: 0.019, SQL: 9