Java Swing实现校园最短路径导航系统(Dijkstra算法完整源码+详细解析)

一、项目简介

本项目基于 Java Swing 图形界面 +Dijkstra最短路径算法 实现校园导航系统。能够模拟校园内多个地标节点,用户可自由选择起点和终点,程序自动计算出校园内最短步行路径与总距离,可视化展示完整行走路线。

项目适用于 数据结构课程设计、Java课程设计、最短路径算法实战,代码完整可运行、无第三方依赖、结构清晰、非常适合初学者学习与毕业设计使用。

项目功能

  • ✅ 自定义校园地点节点(校门、图书馆、教学楼、食堂、宿舍楼)

  • ✅ 构建校园无向道路网络图

  • ✅ Dijkstra 算法求解全局最短路径

  • ✅ Swing 可视化图形界面,操作简单

  • ✅ 动态输出行走路线、总距离

  • ✅ 修复起点终点一致时的报错BUG

二、技术栈说明

  • 编程语言:Java

  • GUI框架:Swing(原生JDK,无需导入依赖)

  • 核心算法:Dijkstra单源最短路径算法(优先队列优化)

  • 数据结构:邻接表存储图、优先队列、数组、List集合

三、系统设计思路

1. 节点设计(地点)

自定义 Node 类,存储校园节点 ID 和地点名称,代表校园中的每一个地标位置。

2. 边设计(道路)

自定义 Edge 类,存储目标节点编号与道路权重(距离),校园道路为无向图,双向通行距离一致。

3. 图结构存储

使用 List<List<Edge>> 邻接表存储整张校园地图,空间效率高,适合稀疏图。

4. Dijkstra算法原理

通过优先队列不断选出当前最短距离节点,松弛更新邻边距离,最终得到起点到所有节点的最短距离,并通过前驱数组回溯完整路径。

四、完整可运行源码

java 复制代码
/**
 * @Author crowed by 王国政
 * @Date 2026/09/11 0011 9:56
 */
import javax.swing.*;
import java.awt.*;
import java.util.*;
import java.util.List;

// 地点节点
class Node {
    String name;
    int id;
    Node(int id, String name) {
        this.id = id;
        this.name = name;
    }
}

// 边(道路)
class Edge {
    int to;
    double weight;
    Edge(int to, double weight) {
        this.to = to;
        this.weight = weight;
    }
}

// Dijkstra算法核心工具类
class DijkstraUtil {
    private List<List<Edge>> graph;
    private int nodeNum;

    public DijkstraUtil(int n) {
        nodeNum = n;
        graph = new ArrayList<>();
        for(int i=0;i<n;i++){
            graph.add(new ArrayList<>());
        }
    }

    // 添加无向边
    public void addEdge(int from, int to, double w) {
        graph.get(from).add(new Edge(to,w));
        graph.get(to).add(new Edge(from,w));
    }

    // Dijkstra最短路径计算
    public Map<String, Object> dijkstra(int startId, int endId){
        double[] dist = new double[nodeNum];
        Arrays.fill(dist, Double.MAX_VALUE);
        int[] prev = new int[nodeNum];
        Arrays.fill(prev, -1);
        dist[startId] = 0;

        // 优先队列:按距离升序
        PriorityQueue<double[]> pq = new PriorityQueue<>(Comparator.comparingDouble(o -> o[0]));
        pq.add(new double[]{0, startId});

        while(!pq.isEmpty()){
            double[] curr = pq.poll();
            int u = (int) curr[1];
            double d = curr[0];
            if(d > dist[u]) continue;
            for(Edge e : graph.get(u)){
                int v = e.to;
                if(dist[v] > dist[u] + e.weight){
                    dist[v] = dist[u] + e.weight;
                    prev[v] = u;
                    pq.add(new double[]{dist[v], v});
                }
            }
        }
        // 回溯路径
        List<Integer> path = new ArrayList<>();
        for(int cur = endId; cur != -1; cur = prev[cur]){
            path.add(cur);
        }
        Collections.reverse(path);
        Map<String,Object> res = new HashMap<>();
        res.put("distance", dist[endId]);
        res.put("path", path);
        return res;
    }
}

// 校园导航GUI主界面
public class CampusNav extends JFrame {
    DijkstraUtil dijkstra;
    List<Node> nodeList;
    JComboBox<String> startBox, endBox;
    JTextArea resultArea;

    public CampusNav(){
        // 窗口基础设置
        setTitle("校园最短路径导航系统(Dijkstra算法)");
        setSize(600,400);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLayout(new BorderLayout());

        // 初始化校园节点
        nodeList = new ArrayList<>();
        nodeList.add(new Node(0,"校门"));
        nodeList.add(new Node(1,"图书馆"));
        nodeList.add(new Node(2,"教学楼A"));
        nodeList.add(new Node(3,"食堂"));
        nodeList.add(new Node(4,"宿舍楼"));

        // 初始化地图道路
        dijkstra = new DijkstraUtil(5);
        dijkstra.addEdge(0,1,120);
        dijkstra.addEdge(1,2,80);
        dijkstra.addEdge(1,3,150);
        dijkstra.addEdge(2,3,90);
        dijkstra.addEdge(3,4,70);
        dijkstra.addEdge(0,2,220);

        // 顶部选择面板
        JPanel topPanel = new JPanel();
        topPanel.add(new JLabel("起点:"));
        startBox = new JComboBox<>();
        endBox = new JComboBox<>();
        for(Node n : nodeList){
            startBox.addItem(n.name);
            endBox.addItem(n.name);
        }
        topPanel.add(startBox);
        topPanel.add(new JLabel("终点:"));
        topPanel.add(endBox);
        JButton btnCalc = new JButton("计算最短路径");
        topPanel.add(btnCalc);

        // 结果展示区域
        resultArea = new JTextArea();
        resultArea.setLineWrap(true);
        JScrollPane scroll = new JScrollPane(resultArea);

        add(topPanel, BorderLayout.NORTH);
        add(scroll, BorderLayout.CENTER);

        // 按钮点击事件
        btnCalc.addActionListener(e -> {
            int startIdx = startBox.getSelectedIndex();
            int endIdx = endBox.getSelectedIndex();
            Map<String,Object> ans = dijkstra.dijkstra(startIdx, endIdx);
            double dis = (Double) ans.get("distance");
            List<Integer> pathId = (List<Integer>) ans.get("path");

            StringBuilder sb = new StringBuilder();
            sb.append("===== 最短路径结果 =====\n");
            sb.append("总距离:").append(dis).append(" 米\n");
            sb.append("路线:");
            for(int i = 0; i < pathId.size(); i++){
                sb.append(nodeList.get(pathId.get(i)).name);
                if(i != pathId.size()-1){
                    sb.append(" → ");
                }
            }
            resultArea.setText(sb.toString());
        });
    }

    public static void main(String[] args) {
        // Swing线程安全启动
        SwingUtilities.invokeLater(()->{
            new CampusNav().setVisible(true);
        });
    }
}

五、代码模块解析

1. Node 节点类

存储每一个校园地点的编号和名称,是图结构中的顶点数据。

2. Edge 边类

记录当前道路通向的节点和道路长度权重,构成图的边信息。

3. DijkstraUtil 算法工具类

封装图的构建、最短路径计算逻辑。采用优先队列优化,时间复杂度更低,路径回溯可以完整还原行走路线。

4. GUI界面模块

通过下拉框选择起止地点,点击按钮触发算法计算,最终将最短距离、完整行走路线展示在文本域中。修复了原代码起点终点相同时字符串截取报错的BUG。

六、运行效果演示

  1. 运行程序后弹出可视化窗口;

  2. 选择起点、终点;

  3. 点击【计算最短路径】;

  4. 系统自动输出最优路径与总米数。

测试案例:校门 → 宿舍楼

最短路径:校门 → 图书馆 → 教学楼A → 食堂 → 宿舍楼

总距离:360.0 米

七、项目亮点总结

  • 代码结构分层清晰:实体类、算法工具类、UI界面分离

  • 标准 Dijkstra 优先队列优化算法,学习价值高

  • Swing 界面简洁美观,操作直观

  • 修复经典边界BUG,程序健壮性高

  • 可直接用于课程设计、作业提交、CSDN发布、学习演示

八、扩展方向(可二次开发)

  • 增加校园地图绘制,可视化节点和路线

  • 增加更多校园点位与道路

  • 支持路径数据保存至本地文件

  • 增加BFS、Floyd算法对比

  • 美化界面、更换主题样式

结语

本项目完整实现了基于Dijkstra算法的校园最短路径导航,代码通俗易懂、适合初学数据结构与Java GUI的同学学习参考。需要项目报告、论文、运行截图、思维导图均可留言!

相关推荐
边境悍匪1 小时前
蜗牛学苑 Java 智能体学习 Day41|ElementPlus 布局、Vue‑Router 登录、Axios 思维导图复盘
java·vue.js·学习
影视飓风TIM1 小时前
C++ 智能指针:auto_ptr / unique_ptr / shared_ptr / weak_ptr 原理与使用
开发语言·c++
一木 之林1 小时前
李沐《动手学深度学习》知识卡合集:从 Softmax 回归到房价实战(第24-50集)
开发语言·c++·人工智能
Alphapeople1 小时前
路径规划算法的python实现
开发语言·python·算法
重生之小比特1 小时前
【Java SE】数组的定义与使用
java·开发语言
LabVIEW开发1 小时前
从饱和升温曲线到参数辨识:在LabVIEW中拟合y=a(1-e^(-bx))
算法·labview·labview知识·labview功能·labview程序
旋生万物1 小时前
圈道裂痕——用 Python 验证素数分布的螺旋生成论判据
开发语言·python·数论·素数·cci·可计算数学
keyipatience1 小时前
5种IO模型与阻塞IO,select,poll,epoll,LT和ET模式
linux·服务器·网络·数据结构·c++·算法
qeen871 小时前
【C++】智能指针介绍
开发语言·c++·笔记·指针