Java案例:行走的圣诞老人

Posted howard2005

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java案例:行走的圣诞老人相关的知识,希望对你有一定的参考价值。

文章目录

一、运行效果

  • 单击【开始】按钮后,通过按键移动圣诞老人,单击【停止】,圣诞老人就停止不动

二、涉及知识点

  1. 基本控制结构
  2. 数组
  3. 图形用户界面
  4. 多线程

三、实现步骤

(一)创建Java项目

  • 创建Java项目 - WalkingSantaClaus

(二)准备图片素材

  • 在项目根目录创建images目录,将七张图片拷贝进去

(三)创建包、创建类

1、创建包

  • 创建net.huawei.gui

2、创建类

  • net.huawei.gui包里创建WalkingSantaClaus
package net.huawei.gui;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

/**
 * 功能:行走的圣诞老人
 * 作者:华卫
 * 日期:2022年04月14日
 */
public class WalkingSantaClaus extends JFrame 

    private JPanel panel1 = new JPanel();
    private JPanel panel2 = new JPanel();
    private MyCanvas mc = new MyCanvas();
    private JButton btnStart = new JButton("开始");
    private JButton btnStop = new JButton("停止");
    private JLabel lblSpeed = new JLabel("设置行走速度:");
    private JComboBox cobSpeed = new JComboBox();

    private Thread thread;
    boolean isRunning;

    private Image[] imgMan = new Image[7];
    int imgIndex = 0;
    int sleepTime = 400; // 定义睡眠时间
    int stepLength = 20; // 定义移动步长
    int x = 200, y = 100; // 定义图像左上角坐标

    /**
     * 主方法
     *
     * @param args
     */
    public static void main(String[] args) 
        new WalkingSantaClaus();
    

    /**
     * 无参构造方法
     */
    public WalkingSantaClaus() 
        super("行走的圣诞老人——单击开始按钮后,按方向键可移动圣诞老人");
        initGUI(); // 初始化图形用户界面
        eventsHandling(); // 进行事件处理
    

    /**
     * 初始化用户界面
     */
    private void initGUI() 
        for (int i = 0; i < imgMan.length; i++) 
            imgMan[i] = this.getToolkit().getImage(
                    "images/man" + (i + 1) + ".jpg");
        

        // 添加组件到内容面板里
        this.getContentPane().setLayout(new BorderLayout());
        this.getContentPane().add(panel1, "Center");
        this.getContentPane().add(panel2, "South");

        mc.setSize(500, 350);
        mc.setBackground(Color.WHITE);
        panel1.add(mc);

        panel2.setLayout(new FlowLayout());
        panel2.add(btnStart);
        panel2.add(btnStop);
        panel2.add(lblSpeed);
        panel2.add(cobSpeed);

        cobSpeed.addItem("快速");
        cobSpeed.addItem("中速");
        cobSpeed.addItem("慢速");

        // 设置窗口属性
        this.setSize(500, 450);
        this.setLocationRelativeTo(null);
        this.setResizable(false);
        this.setVisible(true);
        this.pack();
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    

    /**
     * 事件处理
     */
    private void eventsHandling() 
        mc.addKeyListener(new KeyAdapter() 
            public void keyPressed(KeyEvent e) 
                if (isRunning == false) 
                    return;
                
                switch (e.getKeyCode()) 
                    case 37: // 按左方向键
                        x = x - stepLength;
                        break;
                    case 38: // 按上方向键
                        y = y - stepLength;
                        break;
                    case 39:// 按右方向键
                        x = x + stepLength;
                        break;
                    case 40:// 按下方向键
                        y = y + stepLength;
                        break;
                

                if (x < 0)  // 碰左壁
                    x = 0;
                
                if (x >= mc.getWidth() - imgMan[0].getWidth(mc))  // 碰右壁
                    x = mc.getWidth() - imgMan[0].getWidth(mc);
                
                if (y < 0)  // 碰上壁
                    y = 0;
                
                if (y >= mc.getHeight() - imgMan[0].getHeight(mc))  // 碰下壁
                    y = mc.getHeight() - imgMan[0].getHeight(mc);

                                
                mc.repaint(); // 重绘画布
            
        );

        // 开始按钮单击事件处理
        btnStart.addActionListener(new ActionListener() 
            public void actionPerformed(ActionEvent arg0) 
                start();
                mc.requestFocus();
            
        );

        // 停止按钮事件处理
        btnStop.addActionListener(new ActionListener() 
            public void actionPerformed(ActionEvent arg0) 
                stop();
                mc.requestFocus();
            
        );

        // 速度组合框事件处理
        cobSpeed.addItemListener(new ItemListener() 
            public void itemStateChanged(ItemEvent e) 
                switch (cobSpeed.getSelectedIndex()) 
                    case 0:
                        sleepTime = 200;
                    case 1:
                        sleepTime = 600;
                    case 2:
                        sleepTime = 1000;
                
                mc.requestFocus();
            
        );
    

    /**
     * 自定义画布类
     */
    class MyCanvas extends Canvas 
        public void paint(Graphics g) 
            g.drawImage(imgMan[imgIndex], x, y, 145, 153, this);
        

        public void update(Graphics g) 
            paint(g); // 避免闪烁
        
    

    /**
     * 开始方法 - 启动线程
     */
    public void start() 
        isRunning = true;
        thread = new Thread(new Runnable() 
            @Override
            public void run() 
                while (isRunning) 
                    try 
                        Thread.sleep(sleepTime);
                     catch (InterruptedException e) 
                        e.printStackTrace();
                    
                    imgIndex++;
                    imgIndex = imgIndex % 7;
                    mc.repaint(); // 重绘画布
                
            
        );
        thread.start();
    

    /**
     * 停止方法 - 销毁线程
     */
    public void stop() 
        isRunning = false;
        thread = null;
    

(四)运行程序,查看结果

  • 单击工具栏上运行按钮
  • 单击【开始】按钮后,通过按键移动圣诞老人,单击【停止】,圣诞老人就停止不动

以上是关于Java案例:行走的圣诞老人的主要内容,如果未能解决你的问题,请参考以下文章

圣诞节PPT模板制作技巧分析

圣诞树用C语言给女友写一个圣诞树

Python用*打印圣诞树图案要求树冠三角形部分为n=5行,中间树干部分为4行,每行三个*

70行代码绘制canvas圣诞树:无需引入图片和外部文件

70行代码绘制canvas圣诞树:无需引入图片和外部文件

Hyvää joulua!圣诞快乐!