本文分享Java的一个有趣小项目,实现用键盘控制小球的移动
涉及java知识点:Swing GUI框架,绘图机制,事件处理,焦点控制
1.编写窗口和面板
(1.)定义面板类 Panel 继承自Java 自带类JPanel

(2.)定义窗口类 window 继承自Java 自带类JFrame
各行代码解释如下图

2.放进小球
(1)

(2.)alt + insert ,重写paint()方法,用来绘图



(3.)绘制小球组件
使用setColor方法设置颜色
使用fillOval()方法绘制了一个小球,注意小球的坐标点是它的外接矩形的左上角坐标
如下图这个意思


(4.)试运行
这时在主类的主方法里 创建一个窗口的对象就可以试运行了,看看小球出现没

成功~!

3.实现小球移动
我们已经实现了一个窗口,窗口里有面板,面板里放了一个粉色小球,接下来我们让它动起来~!
这里就涉及到了Java的事件监听。
(1.)让面板类Panel 实现键盘监听接口KeyListener

这时会爆红,不怕,把鼠标放到红线上,在弹出的卡片中点击实现方法

选择这三个方法,点击确定,

实现重写接口的三个抽象方法,如下

(2.)解释一下这三个方法
这三个方法是 Java 中 KeyListener
接口的回调方法,用于处理键盘事件。它们的触发条件和区别如下:
1. keyTyped(KeyEvent e)
触发条件:
-
当用户按下并释放一个能产生 Unicode 字符的键时触发
-
只对能产生可见字符的按键有效(字母、数字、符号等)
-
不响应功能键(如 F1-F12、Ctrl、Shift、Alt、方向键等)
特点:
-
报告的是"已键入的字符"而非物理按键
-
会受到键盘修饰键(如 Shift)的影响(Shift+a 会报告 'A')
-
在
keyPressed
之后、keyReleased
之前触发
2. keyPressed(KeyEvent e)
触发条件:
-
当键盘上任意键被按下时立即触发
-
响应所有按键(包括功能键和控制键)
-
如果按住按键不放,会重复触发(取决于系统设置)
特点:
-
报告的是物理按键的按下动作
-
可以检测组合键(如 Ctrl+C)
-
使用
e.getKeyCode()
获取按键代码(如KeyEvent.VK_A
)
3. keyReleased(KeyEvent e)
触发条件:
-
当键盘上任意被按下的键释放时触发
-
响应所有按键(包括功能键和控制键)
-
每个按键按下都会对应一个释放事件
特点:
-
总会在对应的
keyPressed
之后触发 -
适合检测按键释放的动作
-
同样可以检测组合键
三句话概括

(3.)添加监听器
如图,给实现了键盘监听接口KeyListener 的面板类 添加无参构造函数,
setFocusable(true); // 关键!让面板可以获取焦点
addKeyListener(this); // 直接在面板上添加监听器

(4.)小球移动逻辑
对于刚刚介绍的三个方法,我们既然想用键盘控制移动,那么就应该选择第二个,按下时触发的方法。
e.getKeyCode() 得到所按下键对应的代码
上下左右箭头键分别对应
KeyEvent.VK_UP
按下上箭头,我们让小球y坐标-10,也就是向上移动10个像素
KeyEvent.VK_DOWN
按下下箭头,我们让小球y坐标+10,也就是向下移动10个像素
KeyEvent.VK_LEFT
按下左箭头,我们让小球x坐标-10,也就是向左移动10个像素
KeyEvent.VK_RIGHT
按下右箭头,我们让小球x坐标+10,也就是向右移动10个像素

(5.)刷新面板
坐标变化后,我们刷新面板,这样就实现了移动
调用repaint() 方法

(6)运行演示
键盘控制小球移动演示视频
4.项目代码
java
package com.xiaoban.CSDn;
import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
/*
@author xiaoban
@version 1.0
*/
public class BallMove {
public static void main(String[] args) {
window window = new window();
}
}
//窗口类
class window extends JFrame {
Panel panel;
public window() {
panel = new Panel();//初始化面板
this.add(panel);//把面板放进窗口
setSize(600, 600);//设置窗口大小
setVisible(true);//设置窗口为可见
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置点击窗口关闭键退出程序
}
}
//面板类
class Panel extends JPanel implements KeyListener {
public Panel() {
setFocusable(true); // 关键!让面板可以获取焦点
addKeyListener(this); // 直接在面板上添加监听器
}
//把小球坐标设为变量,初始化小球坐标
int x = 10;
int y = 10;
@Override
public void paint(Graphics g) {
super.paint(g);
//绘制小球
g.setColor(Color.PINK);//设置颜色为粉色
g.fillOval(x, y, 20, 20);//小球坐标为xy,长宽为20(个像素)
}
//当有字符输出时会触发
@Override
public void keyTyped(KeyEvent e) {
}
//当某个键按下时,该方法触发
@Override
public void keyPressed(KeyEvent e) {
//根据用户按下不同的键(上下左右箭头),来移动小球
switch (e.getKeyCode()) {
case KeyEvent.VK_UP:
y -= 10;
break;
case KeyEvent.VK_DOWN:
y += 10;
break;
case KeyEvent.VK_LEFT:
x -= 10;
break;
case KeyEvent.VK_RIGHT:
x += 10;
break;
}
//刷新(重绘)面板
this.repaint();
}
//当某个键释放(松开)时,该方法触发
@Override
public void keyReleased(KeyEvent e) {
}
}
---------------------结束------------------
求点赞~!
求评论·~~~!
求收藏~~~~~!