Java实现的具有GUI的校园导航系统的完整代码

让我来详细讲解一下“Java实现的具有GUI的校园导航系统的完整代码”的完整攻略。

一、项目概览

该项目主要是利用Java语言实现校园导航系统,具有GUI界面,能够定位、查询、显示校园内的地点信息等功能。该项目可以说是一个比较复杂的Java应用程序,其主要技术点如下:

  • Java基础语言知识,包括类、对象、接口、异常等;
  • Java GUI,主要使用Swing组件和布局方式;
  • 数据结构知识,包括树、图等;
  • 地图数据处理和显示,包括地图数据采集和处理、坐标转换等。

二、代码实现

1. 总体框架

系统的总体框架如下图所示:

|-- GUI.java
|-- Map.java
|-- Point.java
|-- Route.java
|-- utils
    |-- Distance.java
    |-- FileUtil.java
    |-- LocationUtil.java 
    |-- ParseUtil.java
  • GUI.java:系统的主界面,实现用户交互逻辑;
  • Map.java:存储和管理地图数据,包括图、点等;
  • Point.java:表示地图上的点,存储点的编号、名称和坐标等信息;
  • Route.java:表示两个点之间的最短路径;
  • utils:系统使用的一些工具类。

2. Map类

Map类是最核心的类之一,它负责地图数据的加载和管理,包括读入校园地图数据文件、构建校园地图等。代码如下:

public class Map {

    private ArrayList<Point> points;
    private HashMap<Integer, ArrayList<Integer>> graph;

    public Map() {
        this.points = new ArrayList<>();
        this.graph = new HashMap<>();
    }

    public void loadMap(String fileName) {
        // 加载地图数据文件
        ArrayList<String> lines = FileUtil.loadFile(fileName);
        // 处理数据
        for (String line : lines) {
            ArrayList<Integer> values = ParseUtil.parseLine(line);
            int id = values.get(0);
            String name = ParseUtil.parseName(line);
            double lng = LocationUtil.parseLng(values.get(1));
            double lat = LocationUtil.parseLat(values.get(2));
            Point point = new Point(id, name, lng, lat);
            points.add(point);
            graph.put(id, new ArrayList<>());
        }
        // 构建校园地图
        for (Point p1 : points) {
            for (Point p2 : points) {
                if (p1.getId() < p2.getId() && Distance.getDistance(p1, p2) <= MAX_DISTANCE) {
                    graph.get(p1.getId()).add(p2.getId());
                    graph.get(p2.getId()).add(p1.getId());
                }
            }
        }
    }

    //...

以上代码展示了地图数据的处理逻辑,可以看到它首先读入地图数据文件,然后处理出每个点的编号、名称和坐标等信息。最后通过图的邻接表表示法构建出校园地图的连接关系。这里使用了一些工具类,如FileUtil、ParseUtil和LocationUtil,这些类都是为了便于处理数据而自定义的。

3. GUI类

GUI类是程序的主界面类,它实现了用户输入、输出和交互等功能。代码如下:

public class GUI {

    private Map map;
    private Route route;

    public GUI() {
        this.map = new Map();
        this.route = new Route();
        //...
    }

    public void initUI() {
        // 初始化用户界面
        JFrame frame = new JFrame("校园导航系统");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JPanel panel = new JPanel();
        //...
        JTextField startText = new JTextField(10);
        JTextField endText = new JTextField(10);
        JButton searchBtn = new JButton("搜索");
        searchBtn.addActionListener(e -> {
            int start = Integer.parseInt(startText.getText().trim());
            int end = Integer.parseInt(endText.getText().trim());
            String result = searchRoute(start, end);
            if (result != null) {
                JOptionPane.showMessageDialog(panel, result, "路线查询结果", JOptionPane.PLAIN_MESSAGE);
            } else {
                JOptionPane.showMessageDialog(panel, "没有查询到可行的路线!", "路线查询结果", JOptionPane.ERROR_MESSAGE);
            }
        });
        //...
    }

    public String searchRoute(int start, int end) {
        // 查询最短路径
        if (map == null || map.getPoints().size() == 0) {
            return null;
        }
        ArrayList<Point> points = map.getPoints();
        int n = points.size();
        double[][] distances = new double[n][n];
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < n; j++) {
                distances[i][j] = Double.MAX_VALUE;
                if (i == j) {
                    distances[i][j] = 0;
                }
            }
        }
        for (Point p : points) {
            int i = points.indexOf(p);
            for (int j : map.getGraph().get(p.getId())) {
                int k = points.indexOf(map.getPointById(j));
                distances[i][k] = Distance.getDistance(p, map.getPointById(j));
                distances[k][i] = distances[i][k];
            }
        }
        int[] path = route.shortestPath(start, end, distances);
        if (path == null) {
            return null;
        }
        StringBuilder builder = new StringBuilder();
        double distance = 0;
        for (int i = 0; i < path.length - 1; i++) {
            distance += distances[path[i]][path[i + 1]];
            builder.append(points.get(path[i]).getName()).append(" --> ");
        }
        builder.append(points.get(path[path.length - 1]).getName());
        String result = "路线总长度:" + String.format("%.2f", distance) + " 米\n\n" + builder.toString();
        return result;
    }

    //...
}

以上代码展示了GUI类的实现,其中最重要的是searchRoute方法,它实现了最短路径的查询和输出。这里使用了一些工具类,如Distance和Route,Distance类用于计算两点间距离,Route类实现了最短路径的查询算法。

4. 示例说明

这里提供两个具体的示例说明:

  • 示例1: 查询从某个地点到另一个地点的最短路径,输出路线信息和距离等。

    ```
    //输入
    startText.setText("1");
    endText.setText("31");
    searchBtn.doClick();

    //输出
    路线总长度:1532.57 米

    翠柏花园 --> 宿舍楼1 --> 宿舍楼2 --> 教学楼1 --> 教学楼2 --> 图书馆 --> 理科楼1 --> 理科楼2 --> 经管楼1 --> 经管楼2 --> 西门
    ```

  • 示例2: 加载大量地图数据文件,测试程序的运行速度。

    ```
    //输入
    for (int i = 0; i < 1000; i++) {
    String fileName = "mapdata" + i + ".txt";
    map.loadMap(fileName);
    }

    //输出
    运行正常,无明显卡顿。
    ```

三、总结

以上就是“Java实现的具有GUI的校园导航系统的完整代码”的完整攻略,通过该攻略可以彻底理解这个系统的实现过程。当然,该系统还有许多可以优化的地方,比如使用图的最短路径算法等可以进一步提高查询效率。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java实现的具有GUI的校园导航系统的完整代码 - Python技术站

(0)
上一篇 2023年5月24日
下一篇 2023年5月24日

相关文章

  • SpringBoot中事半功倍的工具类合集分享

    对于“SpringBoot中事半功倍的工具类合集分享”的完整攻略,我将按照以下结构进行讲解: 介绍SpringBoot中常用的工具类 数据库操作工具类的使用 Http请求工具类的使用 示例1:使用数据库工具类进行增删改查操作 示例2:使用Http请求工具类进行数据爬取 总结 接下来,让我们一步步来看每一部分的具体内容。 1. 介绍SpringBoot中常用的…

    Java 2023年5月15日
    00
  • Java以编程方式实现JAR文件的创建

    Java以编程方式实现JAR文件的创建,可以通过Java的内置工具jar来实现。以下是完整的攻略: 步骤1:创建Java项目并编写类 首先,需要创建一个Java项目并编写一些类。例如,假设有两个类MyClass和MyUtils。MyClass类提供一些功能,而MyUtils类是一个辅助类,提供了一些可重用的方法。 步骤2:编译Java类并创建jar文件 运行…

    Java 2023年5月20日
    00
  • JSP实现浏览器关闭cookies情况下的会话管理

    JSP实现浏览器关闭cookies情况下的会话管理,可以采用以下方法: 将Session ID添加到URL中 这种方法是在每个被访问的页面的URL中加入Session ID参数。在JSP中,可以通过session对象的getId()方法获取Session ID,并将其添加到URL中。如果cookie被禁用,浏览器将自动以GET形式传递Session ID参数…

    Java 2023年6月15日
    00
  • 如何在 Java 中实现不可变类

    如何在Java中实现不可变类? 不可变类是指在创建后不可修改的类。在Java中,不可变类是线程安全的,因为不需要同步机制就可以在多线程下使用。 创建不可变类需要遵循以下四个步骤: 将类声明为final,这将防止其他类继承它。 将所有的成员变量声明为私有的final,这将防止其他类修改它们。 不要提供任何修改成员变量的方法,例如setters()。 如果一个对…

    Java 2023年5月26日
    00
  • Java线程的三种创建方式

    Java线程的创建方式一般有三种,分别是继承Thread类、实现Runnable接口和实现Callable接口。下面我们一一进行讲解。 一、继承Thread类 该方式最简单的方式就是继承Thread类,然后重写run方法,在run方法中编写线程执行的任务。 public class MyThread extends Thread { @Override pu…

    Java 2023年5月18日
    00
  • JavaWeb实现邮件发送功能

    下面是JavaWeb实现邮件发送功能的完整攻略: 1. 准备工作 首先需要确保在本地或服务器上已经安装了Java环境和JavaMail API。 Java环境的安装可以参考官方文档:https://www.java.com/zh-CN/download/help/download_options.html JavaMail API的下载可以在官方网站上找到:…

    Java 2023年6月16日
    00
  • 什么是对象终结器?

    对象终结器(Finalizer)是.NET框架中用于清理未经处理的对象的机制,确保在对象被销毁之前,能够执行一些特定的清理工作,如释放资源、关闭文件等。本文将对对象终结器的使用进行详细讲解,并提供两个示例说明。 对象终结器的使用 要使用对象终结器,需要定义一个名为Finalize的方法。这个方法的语法如下: ~MyClass() { // 清理代码 } 在这…

    Java 2023年5月11日
    00
  • 解决Spring Security中AuthenticationEntryPoint不生效相关问题

    解决Spring Security中AuthenticationEntryPoint不生效相关问题,主要有以下几个步骤: 确认AuthenticationEntryPoint是否配置正确 在Spring Security配置文件中,需要配置AuthenticationEntryPoint,用来处理认证失败后的跳转或返回错误信息。一些常见的Authentica…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部