一、运行效果
- 单击【开始】按钮后,通过按键移动圣诞老人,单击【停止】,圣诞老人就停止不动
二、涉及知识点
- 基本控制结构
- 数组
- 图形用户界面
- 多线程
三、实现步骤
(一)创建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.*;
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;
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;
}
}
(四)运行程序,查看结果
- 单击工具栏上运行按钮
- 单击【开始】按钮后,通过按键移动圣诞老人,单击【停止】,圣诞老人就停止不动