JAVA|智能无人机平台(一)

前言

在完成线程与进程核心知识点的学习后,本项目作为多线程编程实践案例 ,基于 Java Swing 开发了智能无人机平台程序。

文章目录

一、功能概述

该版本基于 Java Swing 开发了一个简单的智能无人机平台程序,核心功能如下:

  1. 窗体展示:创建 800*700 像素的可视化窗体,标题为 "智能无人机平台"
  2. 无人机绘制:通过多层椭圆叠加绘制出简单的无人机的可视化图形
  3. 动态移动:实现两个无人机图形在窗体范围内自动移动,碰到设定的边界(x 轴 0-600、y 轴 0-500)后反弹,持续循环运动
  4. 多线程控制:通过自定义线程类处理无人机的移动和重绘逻辑,保证界面不卡顿

二、技术栈

  1. 图形化界面框架:Swing(JFrame 窗体、Graphics 图形绘制类)
  2. AWT 组件:Graphics、BufferedImage、Color 等,用于图形绘制和图像缓存
  3. 多线程技术:继承 Thread 类实现自定义线程,重写 run 方法处理循环绘制和移动逻辑

三、核心步骤拆解

1:搭建窗体基础框架(DroneUI类)

  1. 创建 DroneUI 类继承 JFrame,作为程序主窗体
  2. 在构造方法中配置窗体属性:设置标题、尺寸、关闭行为、居中显示、可见性
  3. 获取窗体的 Graphics 绘图对象,创建并启动自定义的 DroneThread 线程

2:实现无人机线程逻辑(DroneThread类)

  1. 定义线程类继承 Thread,声明无人机位置(x/y、x1/y1)、移动速度(speedx/speedy、speedx1/speedy1)、Graphics 绘图对象等成员变量

  2. 构造方法接收 Graphics 对象,用于后续绘图;提供 setPoint 方法用于修改无人机初始位置

  3. 重写 run 方法,实现核心循环逻辑:

    • 创建 BufferedImage 作为绘图缓存,避免直接绘制导致的闪烁
    • 绘制白色背景清空画布,调用 drawDrone 方法绘制两个无人机
    • 将缓存图像绘制到窗体上,线程休眠 1 毫秒控制刷新频率
    • 判断无人机是否触达边界,若触达则反转移动速度
    • 更新无人机的位置坐标,实现移动效果

3:无人机图形绘制(drawDrone 方法)

  1. 定义三层椭圆的颜色:
    • 浅绿色透明外圈(雷达范围)
    • 灰色中间圈(无人机)
    • 绿色内圈(状态显示灯)
  2. 通过 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 对象、无人机坐标变量)。

相关推荐
雨季6662 小时前
构建 OpenHarmony 文本高亮关键词标记器:用纯字符串操作实现智能标注
开发语言·javascript·flutter·ui·ecmascript·dart
2501_948120152 小时前
Java实现的SSL/TLS协议通信系统
java·开发语言·ssl
b2077212 小时前
Flutter for OpenHarmony 身体健康状况记录App实战 - 个人中心实现
android·java·python·flutter·harmonyos
cici158742 小时前
基于MATLAB的TERCOM算法实现与优化
开发语言·matlab
天上飞的粉红小猪2 小时前
c++的IO流
开发语言·c++
学嵌入式的小杨同学2 小时前
【嵌入式 Linux 实战 1】Ubuntu 环境搭建 + 目录结构详解:嵌入式开发入门第一步
linux·c语言·开发语言·数据结构·vscode·vim·unix
带刺的坐椅2 小时前
Claude Code Agent Skills vs. Solon AI Skills:从工具增强到框架规范的深度对齐
java·ai·agent·claude·solon·mcp·skills
⑩-2 小时前
JUC-场景题
java·开发语言