前言
在完成线程与进程核心知识点的学习后,本项目作为多线程编程实践案例 ,基于 Java Swing 开发了智能无人机平台程序。
文章目录
-
- 前言
- 一、功能概述
- 二、技术栈
- 三、核心步骤拆解
-
- 1:搭建窗体基础框架(DroneUI类)
- 2:实现无人机线程逻辑(DroneThread类)
- [3:无人机图形绘制(drawDrone 方法)](#3:无人机图形绘制(drawDrone 方法))
- 四、关键技术点说明
-
- [1. Swing 窗体绘图机制](#1. Swing 窗体绘图机制)
- [2. 多线程控制](#2. 多线程控制)
- [3. 边界反弹逻辑](#3. 边界反弹逻辑)
- [4. 颜色与图形绘制](#4. 颜色与图形绘制)
- 五、完整代码
-
- [1. DroneThread类](#1. DroneThread类)
- [2. DroneUI类](#2. DroneUI类)
- 3.运行效果
- 六、总结
一、功能概述
该版本基于 Java Swing 开发了一个简单的智能无人机平台程序,核心功能如下:
- 窗体展示:创建 800*700 像素的可视化窗体,标题为 "智能无人机平台"
- 无人机绘制:通过多层椭圆叠加绘制出简单的无人机的可视化图形
- 动态移动:实现两个无人机图形在窗体范围内自动移动,碰到设定的边界(x 轴 0-600、y 轴 0-500)后反弹,持续循环运动
- 多线程控制:通过自定义线程类处理无人机的移动和重绘逻辑,保证界面不卡顿
二、技术栈
- 图形化界面框架:Swing(JFrame 窗体、Graphics 图形绘制类)
- AWT 组件:Graphics、BufferedImage、Color 等,用于图形绘制和图像缓存
- 多线程技术:继承 Thread 类实现自定义线程,重写 run 方法处理循环绘制和移动逻辑
三、核心步骤拆解
1:搭建窗体基础框架(DroneUI类)
- 创建 DroneUI 类继承 JFrame,作为程序主窗体
- 在构造方法中配置窗体属性:设置标题、尺寸、关闭行为、居中显示、可见性
- 获取窗体的 Graphics 绘图对象,创建并启动自定义的 DroneThread 线程
2:实现无人机线程逻辑(DroneThread类)
-
定义线程类继承 Thread,声明无人机位置(x/y、x1/y1)、移动速度(speedx/speedy、speedx1/speedy1)、Graphics 绘图对象等成员变量
-
构造方法接收 Graphics 对象,用于后续绘图;提供 setPoint 方法用于修改无人机初始位置
-
重写 run 方法,实现核心循环逻辑:
- 创建 BufferedImage 作为绘图缓存,避免直接绘制导致的闪烁
- 绘制白色背景清空画布,调用 drawDrone 方法绘制两个无人机
- 将缓存图像绘制到窗体上,线程休眠 1 毫秒控制刷新频率
- 判断无人机是否触达边界,若触达则反转移动速度
- 更新无人机的位置坐标,实现移动效果
3:无人机图形绘制(drawDrone 方法)
- 定义三层椭圆的颜色:
- 浅绿色透明外圈(雷达范围)
- 灰色中间圈(无人机)
- 绿色内圈(状态显示灯)
- 通过 Graphics 的 fillOval 方法,按不同坐标和尺寸绘制三层椭圆,组合成无人机的可视化图形
四、关键技术点说明
1. Swing 窗体绘图机制
- 直接使用 JFrame 的 getGraphics () 获取的绘图对象,绘制内容在窗体刷新时可能丢失,本项目通过 BufferedImage 缓存绘图内容,解决了绘图闪烁和内容丢失问题
- 重写paint 方法会在窗体刷新(如大小调整、显示隐藏)时自动调用
2. 多线程控制
- 无人机的移动和绘图逻辑放在独立线程中,避免阻塞
- Thread.sleep (1) 控制绘图循环的频率,实现近似 60 帧 / 秒的动态效果(实际可根据需求调整休眠时间)
3. 边界反弹逻辑
- 通过判断坐标是否超出设定范围(x>600||x<0、y>500||y<0 等),反转速度值(speedx = -speedx),实现物理上的 "反弹" 效果
- 两个无人机分别维护独立的位置和速度变量,实现各自独立的移动逻辑
4. 颜色与图形绘制
- Color 类支持 RGBA 格式(第四个参数为透明度,0-255),如 new Color (0, 0, 255, 60) 实现蓝色透明效果
- fillOval (int x, int y, int width, int height) 方法的参数分别为椭圆左上角坐标、宽度、高度,通过调整坐标偏移实现多层椭圆的居中叠加
五、完整代码
1. DroneThread类
java
import java.awt.*;
import java.awt.image.BufferedImage;
public class DroneThread extends Thread {
Graphics g;
int x = 400, y = 300;
int speedx = 2, speedy = 2;
int x1 = 100, y1 = 100;
int speedx1 = 1, speedy1 = 1;
public void setPoint(int x, int y) {
this.y = y;
this.x = x;
}
public DroneThread(Graphics g) {
this.g = g;
}
@Override
public void run() {
for (int i = 0; ; i++) {
BufferedImage img = new BufferedImage(800, 700, 2);
Graphics bg = img.getGraphics();
bg.setColor(Color.WHITE);
bg.fillRect(0, 0, 800, 700);
drawDrone(bg, x, y, speedx, speedy);
drawDrone(bg, x1, y1, speedx1, speedy1);
g.drawImage(img, 0, 0, null);
try {
Thread.sleep(1);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
if (x > 600 || x < 0) {
speedx = -speedx;
}
if (y > 500 || y < 0) {
speedy = -speedy;
}
x += speedx;
y += speedy;
if (x1 > 600 || x1 < 0) {
speedx1 = -speedx1;
}
if (y1 > 500 || y1 < 0) {
speedy1 = -speedy1;
}
x1 += speedx1;
y1 += speedy1;
}
}
public void drawDrone(Graphics bg, int x, int y, int speedx, int speedy) {
Color color1 = new Color(180, 240, 180, 150);
bg.setColor(color1);
bg.fillOval(x, y, 200, 200);
Color color2 = Color.GRAY;
bg.setColor(color2);
bg.fillOval(x + 70, y + 70, 60, 60);// 60*60
Color color3 = Color.GREEN;
bg.setColor(color3);
bg.fillOval(x + 85, y + 85, 30, 30);
}
}
2. DroneUI类
java
import javax.swing.*;
import java.awt.*;
public class DroneUI extends JFrame {
public DroneUI() {
setTitle("智能无人机平台");
setSize(800, 700);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setLocationRelativeTo(null);
setVisible(true);
Graphics g = this.getGraphics();
DroneThread dt = new DroneThread(g);
dt.start();
}
// 绘制窗体 刷新窗体
@Override
public void paint(Graphics g) {
super.paint(g);
}
public static void main(String[] args) {
new DroneUI();
}
}
3.运行效果

六、总结
本项目作为线程与进程学习后的实践案例,通过继承 Thread 类创建自定义线程,将无人机绘图与界面主线程分离,从进程与线程的关系来看,本程序的运行实例是一个独立进程,主线程(main 方法)和 DroneThread 线程共享进程的内存资源(如窗体的 Graphics 对象、无人机坐标变量)。