软件编程
位置:首页>> 软件编程>> java编程>> Java实现的具有GUI的校园导航系统的完整代码

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

作者:康先森  发布时间:2022-06-28 03:43:56 

标签:Java,GUI,校园,导航系统

0.写在前面

2020-5-18更新

这个东西已经是两年前的了,现在问我具体细节我也不是很清楚了,而且现在review两年前的代码感觉写的好烂。。。请大家有问题下面留言,不要加我的企鹅了,正在准备考研,比较忙。

一点建议:

1.当时会的比较少,对象实例化对于单纯的数据查询来说效率极低而且很蠢,我现在更建议使用数据库,或者简单点用xmlorjson都可以,建议想写的好一点的同学把里面的数据读写逻辑改一改,用数据库不香吗

2.这个是分客户端服务端的,服务端相当于用底层手撸了一个相当简单的tomcat,所有的界面都是要从Client进去的。先开server再开Client,在注册时以邀请码判断是否为管理员。以管理员身份进入client之后再去添加信息。

3.如果注册时报access is denied 在Flie的路径下加一层文件夹,如下

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

小一个月没更新博客了,主要是临近期末,各科的大作业都下来了,今天把自己奋斗了一个礼拜的校园导航系统贴在上面,也算满足下自己的小成就感Java实现的具有GUI的校园导航系统的完整代码

2.主界面

登录成功后就是主界面了。为了省事儿,我直接截了张图为导航的地图。这个地图是可以更换的。(动态更改我也不会啊(`Δ´)!)


import javax.swing.*;
  import java.awt.*;
  import java.awt.event.MouseAdapter;
  import java.awt.event.MouseEvent;
  import java.io.*;

public class Home
  {
   private JFrame jFrame;
   private JPanel mapLabel;
   private JLabel title, map;
 private JButton admin, menu, close;
   private Font titleFont = new Font("微软雅黑", 1, 28);
   private Font charFont = new Font("微软雅黑", 1, 20);
   private Toolkit toolkit = Toolkit.getDefaultToolkit();

private File pointFile = new File("D://point.obj");
   private File lengthFile = new File("D://length.obj");
   private File mapFile = new File("D://map.png");

private boolean isAdmin = false;

public Home(boolean isAdmin)
    {
       this.isAdmin = isAdmin;//确定用户身份
        init();
   }

public void init()
    {
       jFrame = new JFrame();
       jFrame.setLayout(new BorderLayout());

titleInit();//初始化标题栏
       mapInit();//初始化地图

jFrame.setBounds((toolkit.getScreenSize().width - 700) / 2, (toolkit.getScreenSize().height - 450) / 2, 700, 450);

JPanel buttonPanel = new JPanel();
       buttonPanel.setLayout(new FlowLayout());

admin = new JButton("管理员菜单");
       admin.setFont(charFont);
       admin.addMouseListener(new MouseAdapter()
        {
            @Override
            public void mouseClicked(MouseEvent e)
           {
               new AdminMenu();
           }
       });

menu = new JButton("功能菜单");
        menu.setFont(charFont);
       menu.addMouseListener(new MouseAdapter()
       {
          @Override
         public void mouseClicked(MouseEvent e)
           {
               new NormalMenu();
          }
        });
        buttonPanel.add(menu);
      if (isAdmin)
      {
            buttonPanel.add(admin);
          adminTips();
      }
       close = new JButton("关闭");
      close.setFont(charFont);
       close.addMouseListener(new MouseAdapter()
       {
           @Override
          public void mouseClicked(MouseEvent e)
         {
               System.exit(0);
            }
       });
        buttonPanel.add(close);

jFrame.add(buttonPanel, BorderLayout.SOUTH);

jFrame.setResizable(false);
      jFrame.setVisible(true);
   }

public void titleInit()
    {
        title = new JLabel("校园导航系统", SwingConstants.CENTER);
       title.setFont(titleFont);
       jFrame.add(title, BorderLayout.NORTH);//标题文字
   }

public void mapInit()
   {
       ImageIcon imageIcon = new ImageIcon(mapFile.getPath());
       imageIcon.setImage(imageIcon.getImage().getScaledInstance(imageIcon.getIconWidth(),
              imageIcon.getIconHeight(), Image.SCALE_DEFAULT));
        map = new JLabel();
        map.setBounds(0, 0, 690, 400);
        map.setHorizontalAlignment(0);
        map.setIcon(imageIcon);
        mapLabel = new JPanel();
        mapLabel.setSize(690, 400);
        mapLabel.add(map);
        jFrame.add(mapLabel, BorderLayout.CENTER);//地图显示
    }

public void adminTips()
    {
        String errorTitle = "数据错误!";
        try
        {
            checkFile(mapFile, "地图");
        } catch (IOException e)
        {
            e.printStackTrace();
            new mDialog(errorTitle, "请管理员先录入地图数据!", jFrame);
            //writeMap
        }
        try
        {
            checkFile(pointFile, "景点");

} catch (IOException e)
        {
            e.printStackTrace();
            new mDialog(errorTitle, "请管理员先录入景点数据!", jFrame);
            //writePoint
        }
        try
        {
            checkFile(lengthFile, "距离");

} catch (IOException e)
        {
            e.printStackTrace();
            new mDialog(errorTitle, "请管理员先录入距离数据!", jFrame);
            //writeLength
        }
    }

public void checkFile(File file, String string) throws IOException
    {
        if (!file.exists() || file.length() == 0)
        {
            throw new IOException(string + "文件打开失败!");
        }
    }

}

这个没啥坑,需要注意的是:

因为景点的数据,距离数据都是以文件的形式保存的,所以一定会有IO异常。这时候就得提供一个比较友好的提示界面,并同时将异常信息输出到控制台上:

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

这个过程我,我美名其曰为“自检”。听着就高大上~(︶ω︶)~

然后就是主界面了。主界面的地图我直接放了一个题目要求中的截图。

确实比较简陋,但是该有的都有了。

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

两个界面,一个是管理员的一个是一般用户的。


import javax.swing.*;
  import java.awt.*;
  import java.awt.event.MouseAdapter;
  import java.awt.event.MouseEvent;
  import java.io.BufferedReader;
 import java.io.BufferedWriter;
  import java.io.File;

public class AdminMenu
{
    private JFrame jFrame;
   private JButton createPoint, editPoint, deletePoint, createLength, editLength;
   private JButton cancelButton;
   private Toolkit toolkit = Toolkit.getDefaultToolkit();
   private Font font = new Font("微软雅黑", 1, 20);
  private File pointFile = new File("D://point.txt");
  private File lengthFile = new File("D://length.txt");
    private JFrame childFrame;
    private JPanel childPanel;

private BufferedReader bufferedReader;
  private BufferedWriter bufferedWriter;

public AdminMenu()
   {
       jFrame = new JFrame("管理员菜单");
     jFrame.setBounds((toolkit.getScreenSize().width - 250) / 2, (toolkit.getScreenSize().height - 310) / 2, 250, 310);
       jFrame.setLayout(new FlowLayout());

childPanel = new JPanel();
     childPanel.setLayout(new FlowLayout());
        cancelButton = new JButton("关闭");
        childPanel.add(cancelButton);

cancelButton.addMouseListener(new MouseAdapter()
       {
           @Override
          public void mouseClicked(MouseEvent e)
          {
             jFrame.setVisible(false);
          }
      });

createPoint = new JButton("1.创建景点信息");
      createPoint.setFont(font);
      createPoint.addMouseListener(new MouseAdapter()
        {
           @Override
            public void mouseClicked(MouseEvent e)
           {
               new CreatePoint();
           }
      });

editPoint = new JButton("2.修改景点信息");
      editPoint.setFont(font);
       editPoint.addMouseListener(new MouseAdapter()
      {
           @Override
           public void mouseClicked(MouseEvent e)
        {
              new EditPoint();
         }
      });

deletePoint = new JButton("3.删除景点信息");
      deletePoint.setFont(font);
       deletePoint.addMouseListener(new MouseAdapter()
        {
           @Override
          public void mouseClicked(MouseEvent e)
           {
               new DeletePoint();
         }
      });

createLength = new JButton("4.创建道路信息");
       createLength.setFont(font);
       createLength.addMouseListener(new MouseAdapter()
       {
          @Override
          public void mouseClicked(MouseEvent e)
          {
              new CreateLength(jFrame);
           }
       });

editLength = new JButton("5.修改道路信息");
       editLength.setFont(font);
      editLength.addMouseListener(new MouseAdapter()
      {
          @Override
          public void mouseClicked(MouseEvent e)
          {
               new CreateLength(jFrame);
          }
      });

jFrame.add(createPoint);
        jFrame.add(editPoint);
        jFrame.add(deletePoint);
        jFrame.add(createLength);
        jFrame.add(editLength);
        jFrame.add(childPanel);
        jFrame.setVisible(true);
    }

}

import javax.swing.*;
 import java.awt.*;
import java.awt.event.MouseAdapter;
 import java.awt.event.MouseEvent;

class NormalMenu
 {

private JFrame jFrame;
    private JButton visitButton, searchButton, okayButton;
    private Font font = new Font("微软雅黑", 1, 20);
    private Toolkit toolkit = Toolkit.getDefaultToolkit();

public NormalMenu()
    {
        jFrame = new JFrame("功能菜单");
        jFrame.setBounds((toolkit.getScreenSize().width - 250) / 2, (toolkit.getScreenSize().height - 200) / 2, 250, 200);
        jFrame.setLayout(new FlowLayout());
        visitButton = new JButton("1.浏览景点信息");
        visitButton.setFont(font);
        searchButton = new JButton("2.查询最短路径");
        searchButton.setFont(font);
        okayButton = new JButton("关闭");
        okayButton.setFont(font);

visitButton.addMouseListener(new MouseAdapter()
        {
            @Override
            public void mouseClicked(MouseEvent e)
            {
                new VisitPoint();
            }
        });

searchButton.addMouseListener(new MouseAdapter()
        {
            @Override
            public void mouseClicked(MouseEvent e)
            {
                new SearchLength();
            }
        });

okayButton.addMouseListener(new MouseAdapter()
        {
            @Override
            public void mouseClicked(MouseEvent e)
            {
                jFrame.setVisible(false);
            }
        });

jFrame.add(visitButton);
        jFrame.add(searchButton);
        jFrame.add(okayButton);
        jFrame.setResizable(false);
        jFrame.setVisible(true);

}

}

两个菜单的java文件。

3.管理员菜单

管理员有5个功能。

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


import javax.swing.*;
 import java.awt.*;
 import java.awt.event.MouseAdapter;
 import java.awt.event.MouseEvent;
 import java.io.*;
 import java.util.TreeMap;

public class CreatePoint
 {
    private File file;
    private ObjectInputStream objectInputStream;
    private ObjectOutputStream objectOutputStream;
    private TreeMap treeMap;
    private Toolkit toolkit = Toolkit.getDefaultToolkit();

public CreatePoint()
    {
        try
        {
            file = new File("D://point.obj");
            objectInputStream = new ObjectInputStream(new FileInputStream(file));
            treeMap = (TreeMap) objectInputStream.readObject();
        } catch (IOException e)
        {
            treeMap = new TreeMap();
        } catch (ClassNotFoundException e)
        {
        }finally
        {
            frameInit();
        }

}

public void frameInit()
    {
        JSeparator jSeparator = new JSeparator(SwingConstants.HORIZONTAL);
        JTextArea jTextArea = new JTextArea(15, 30);
        JTextField jTextField = new JTextField(20);

JFrame jFrame = new JFrame();
        jFrame.setBounds((toolkit.getScreenSize().width - 350) / 2, (toolkit.getScreenSize().height - 450) / 2, 350, 450);
        jFrame.setLayout(new FlowLayout());

jFrame.add(jTextField);
        jFrame.add(jSeparator);
        jFrame.add(jTextArea);

JButton okayButton = new JButton("确定");
        JButton cancelButton = new JButton("取消");

cancelButton.addMouseListener(new MouseAdapter()
        {
            @Override
            public void mouseClicked(MouseEvent e)
            {
                jFrame.setVisible(false);
            }
        });
        okayButton.addMouseListener(new MouseAdapter()
        {
            @Override
            public void mouseClicked(MouseEvent e)
            {
                treeMap.put(jTextField.getText(), jTextArea.getText());
                try
                {
                    objectOutputStream = new ObjectOutputStream(new FileOutputStream(file));
                    objectOutputStream.writeObject(treeMap);
                    new mDialog("成功", "数据正常保存", jFrame);
                    jFrame.setVisible(false);
                } catch (IOException e1)
                {
                    new mDialog("失败", "数据异常!", jFrame);
                }
            }
        });
        jFrame.add(cancelButton);
        jFrame.add(okayButton);
        jFrame.setVisible(true);

}

public static void main(String[] args)
    {
        new CreatePoint();
    }

}

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

其实可以把两个框里的字体改一下。还有一个,每个框前面其实应该有个提示信息的。我嫌麻烦,后来有点懒得弄了。难度也不是很大,一个JLabel完事儿。

3.2 修改景点信息


import javax.swing.*;
  import java.awt.*;
  import java.awt.event.ItemEvent;
  import java.awt.event.ItemListener;
  import java.awt.event.MouseAdapter;
  import java.awt.event.MouseEvent;
  import java.io.*;
  import java.util.TreeMap;
  import java.util.Iterator;
import java.util.Set;

public class EditPoint
{
    private JComboBox jComboBox;
   private String key;
   private ObjectInputStream objectInputStream;
   private ObjectOutputStream objectOutputStream;
    private TreeMap treeMap;
  private Set<String> set;
    private File file;
  private Toolkit toolkit = Toolkit.getDefaultToolkit();
   JFrame jFrame;

public EditPoint()
 {
       try
      {
          file = new File("D://point.obj");
           jFrame = new JFrame("");
            objectInputStream = new ObjectInputStream(new FileInputStream(file));
           treeMap = (TreeMap) objectInputStream.readObject();
          set = treeMap.keySet();
          frameInit();
      } catch (IOException e)
      {
          new mDialog("错误", "没有文件!", jFrame);
           e.printStackTrace();
      } catch (ClassNotFoundException e)
     {
          e.printStackTrace();
       }
    }

public void frameInit()
  {

jFrame.setBounds((toolkit.getScreenSize().width - 350) / 2, (toolkit.getScreenSize().height - 450) / 2, 350, 450);

jFrame.setLayout(new FlowLayout());

jComboBox = new JComboBox();
       jComboBox.setPreferredSize(new Dimension(270, 30));
       Iterator iterator = set.iterator();
     while (iterator.hasNext())
      {
         jComboBox.addItem((String) iterator.next());
      }
      JTextArea jTextArea = new JTextArea(15, 30);
      jTextArea.setText((String) treeMap.get(jComboBox.getSelectedItem()));

jComboBox.addItemListener(new ItemListener()
     {
           @Override
          public void itemStateChanged(ItemEvent e)
           {
               jTextArea.setText((String) treeMap.get(jComboBox.getSelectedItem()));
           }
       });
       JButton okayButton = new JButton("确定");
       JButton cancelButton = new JButton("取消");
       cancelButton.addMouseListener(new MouseAdapter()
     {
            @Override
           public void mouseClicked(MouseEvent e)
           {
              jFrame.setVisible(false);
           }
        });
       okayButton.addMouseListener(new MouseAdapter()
      {
            @Override
          public void mouseClicked(MouseEvent e)
            {
              String string = jTextArea.getText();
               treeMap.put((String) jComboBox.getSelectedItem(), string);
               try
             {
                  objectOutputStream = new ObjectOutputStream(new FileOutputStream(file));
                  objectOutputStream.writeObject(treeMap);
                   new mDialog("成功", "数据成功修改", jFrame);
                  jFrame.setVisible(false);
               } catch (IOException e1)
              {
                  new mDialog("失败", "数据异常!", jFrame);
               }

}
       });
        jFrame.add(jComboBox);
        jFrame.add(jTextArea);
        jFrame.add(cancelButton);
        jFrame.add(okayButton);
        jFrame.setResizable(false);
        jFrame.setVisible(true);
    }

public static void main(String[] args)
    {
        new EditPoint();
    }
}

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

3.3删除景点信息


import javax.swing.*;
  import java.awt.*;
  import java.awt.event.ItemEvent;
  import java.awt.event.ItemListener;
  import java.awt.event.MouseAdapter;
  import java.awt.event.MouseEvent;
  import java.io.*;
  import java.util.TreeMap;
  import java.util.Iterator;
import java.util.Set;

public class DeletePoint
{
   private JComboBox jComboBox;
   private TreeMap treeMap;
 private ObjectInputStream objectInputStream;
  private ObjectOutputStream objectOutputStream;
 private Set set;
   private File file;
   private Toolkit toolkit = Toolkit.getDefaultToolkit();
    private JFrame jFrame;

public DeletePoint()
  {
       try
       {
           jFrame = new JFrame();
          file = new File("D://point.obj");
          objectInputStream = new ObjectInputStream(new FileInputStream(file));
           treeMap = (TreeMap) objectInputStream.readObject();
         frameInit();
      } catch (IOException e)
       {
          new mDialog("错误", "没有文件!", jFrame);
           e.printStackTrace();

} catch (ClassNotFoundException e)
      {
           e.printStackTrace();
       }
   }

public void frameInit()
   {
       jFrame.setLayout(new FlowLayout());
      jFrame.setBounds((toolkit.getScreenSize().width - 350) / 2, (toolkit.getScreenSize().height - 250) / 2, 350, 250);

jComboBox = new JComboBox();
       jComboBox.setPreferredSize(new Dimension(270,30));//设置大小
      jFrame.add(jComboBox);
      set = treeMap.keySet();
      Iterator iterator = set.iterator();
      while (iterator.hasNext())
      {
           jComboBox.addItem((String) iterator.next());
      }

JLabel jLabel = new JLabel();
       jLabel.setText((String)treeMap.get(jComboBox.getSelectedItem()));//设置景点的相关信息显示
        jLabel.setPreferredSize(new Dimension(270,80));
      jFrame.add(jLabel);

JButton cancelButton = new JButton("取消");
       JButton okayButton = new JButton("确认");
       jFrame.add(cancelButton);
       jFrame.add(okayButton);

jComboBox.addItemListener(new ItemListener()
     {
          @Override
         public void itemStateChanged(ItemEvent e)
           {
             jLabel.setText((String)treeMap.get(jComboBox.getSelectedItem()));
      }
     });

cancelButton.addMouseListener(new MouseAdapter()
       {
          @Override
            public void mouseClicked(MouseEvent e)
           {
              jFrame.setVisible(false);
          }
       });
        okayButton.addMouseListener(new MouseAdapter()
        {
          @Override
           public void mouseClicked(MouseEvent e)
          {
              try
             {
                  treeMap.remove((String) jComboBox.getSelectedItem());

objectOutputStream = new ObjectOutputStream(new FileOutputStream(file));
                 objectOutputStream.writeObject(treeMap);
                   new mDialog("成功", "删除" + (String) jComboBox.getSelectedItem() + "成功!", jFrame);
                   jLabel.setText("");
                   jFrame.setVisible(false);
                } catch (IOException e1)
                {
                    new mDialog("失败", "数据异常!", jFrame);
                } catch (NullPointerException e1)
                {
                    new mDialog("失败", "已经没有景点信息了!", jFrame);//删到最后就变成null了,抛异常就得处理一下
                    jFrame.setVisible(false);
                }
            }
        });

jFrame.setResizable(false);
        jFrame.setVisible(true);
    }

public static void main(String[] args)
    {
        new DeletePoint();
    }
}

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

3.4创建两点间的距离信息


import javax.swing.*;
  import java.awt.*;
  import java.awt.event.ItemEvent;
  import java.awt.event.ItemListener;
  import java.awt.event.MouseAdapter;
  import java.awt.event.MouseEvent;
  import java.io.*;
  import java.util.ArrayList;
  import java.util.Iterator;
import java.util.Set;
import java.util.TreeMap;

public class CreateLength
{
   private JComboBox jComboBox1, jComboBox2;
   private JTextField jTextField;
  private ObjectInputStream objectInputStream1, objectInputStream2;
   private ObjectOutputStream objectOutputStream;
    private File lengthFile;
   private File pointFile;
   private double length[][];
    private Toolkit toolkit = Toolkit.getDefaultToolkit();

private TreeMap treeMap;
    private Set set;

private LengthInfo lengthInfo;
  private ArrayList arrayList;

public CreateLength(JFrame jFrame)
   {

lengthFile = new File("D://length.obj");
        pointFile = new File("D://point.obj");
        try
        {
            objectInputStream1 = new ObjectInputStream(new FileInputStream(pointFile));
      } catch (IOException e)
       {
           new mDialog("错误", "没有景点信息!", jFrame);
       }

try
       {
           objectInputStream2 = new ObjectInputStream(new FileInputStream(lengthFile));
           treeMap = (TreeMap) objectInputStream1.readObject();
           arrayList = (ArrayList) objectInputStream2.readObject();
        } catch (IOException e)
        {
           lengthInfo = new LengthInfo();
            lengthInfo.init();
          arrayList = new ArrayList();
          arrayList.add(lengthInfo);
           try
           {
                objectOutputStream = new ObjectOutputStream(new FileOutputStream(lengthFile));
                objectOutputStream.writeObject(arrayList);
              objectOutputStream.flush();
           } catch (IOException e1)
          {

}
        } catch (ClassNotFoundException e)
      {

}

frameInit();

}

public void frameInit()
   {
       JFrame jFrame = new JFrame();
       jFrame.setLayout(new FlowLayout());
       jFrame.setBounds((toolkit.getScreenSize().width - 350) / 2, (toolkit.getScreenSize().height - 200) / 2, 350, 200);

jTextField = new JTextField(27);
      jComboBox1 = new JComboBox();
       jComboBox1.setPreferredSize(new Dimension(270, 30));
        jComboBox2 = new JComboBox();
       jComboBox2.setPreferredSize(new Dimension(270, 30));

set = treeMap.keySet();
        Iterator iterator = set.iterator();
      while (iterator.hasNext())
       {
           String string = (String) iterator.next();
           jComboBox1.addItem(string);
          jComboBox2.addItem(string);
       }

int from = jComboBox1.getSelectedIndex();
   int to = jComboBox2.getSelectedIndex();

lengthInfo = (LengthInfo) arrayList.get(0);
       jTextField.setText(lengthInfo.getLength(from, to) + "");
        jComboBox1.addItemListener(new ItemListener()
        {
            @Override
            public void itemStateChanged(ItemEvent e)
            {
                jTextField.setText(lengthInfo.getLength(jComboBox1.getSelectedIndex(), jComboBox2.getSelectedIndex()) + "");
            }
        });
        jComboBox2.addItemListener(new ItemListener()
        {
            @Override
            public void itemStateChanged(ItemEvent e)
            {
                jTextField.setText(lengthInfo.getLength(jComboBox1.getSelectedIndex(), jComboBox2.getSelectedIndex()) + "");
            }
        });

JButton cancelButton = new JButton("取消");
        JButton okayButton = new JButton("确认");

cancelButton.addMouseListener(new MouseAdapter()
        {
            @Override
            public void mouseClicked(MouseEvent e)
            {
                jFrame.setVisible(false);
            }
        });
        okayButton.addMouseListener(new MouseAdapter()
        {
            @Override
            public void mouseClicked(MouseEvent e)
            {
                try
                {
                    double weight = Double.parseDouble(jTextField.getText().toString());
                    lengthInfo.editLength(jComboBox1.getSelectedIndex(), jComboBox2.getSelectedIndex(), weight);
                    objectOutputStream = new ObjectOutputStream(new FileOutputStream(lengthFile));
                    objectOutputStream.writeObject(arrayList);

new mDialog("成功", "数据修改成功!", jFrame);
                    jFrame.setVisible(false);
                } catch (NumberFormatException e1)
                {
                    e1.printStackTrace();
                    new mDialog("错误", "请输入正确信息!", jFrame);
                } catch (IOException e1)
                {
                    new mDialog("错误", "信息写入失败!", jFrame);
                }

}
        });

jFrame.add(jComboBox1);
        jFrame.add(jComboBox2);
        jFrame.add(jTextField);
        jFrame.add(cancelButton);
        jFrame.add(okayButton);
        jFrame.setVisible(true);
        jFrame.setResizable(false);
    }

public static void main(String[] args)
    {
        new CreateLength(new JFrame());
    }

}

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

这个就要说明下了,因为当时在写这个模块的时候遇到了不少问题。

第一,存储结构。

既然是选用了迪杰斯特拉算法,那么使用邻接矩阵就是最方便的。我一开始所希望的是一个动态的二维数组,也就是ArrayList<<ArrayList<Integer>> arraylists。但是实际上操作起来会比较麻烦。最后为了赶时间还是用的普通的二维数组int length[][],长度也就固定了。这个动态的二维数组以后再研究下。

还有就是两个JCombobox中元素的顺序问题。景点信息是随时可以更改的,所以这个JCombobox中元素的个数与顺序也是个问题。怎么能保证item与邻接矩阵中的位置精确对应?

我采取的做法,全局将景点的信息用TreeMap存储,key为景点的名称,value为景点的详细信息。然后使用.ketSet()来将key存入set。因为TreeMap保存我存入的相对顺序。要是用HashMap顺序就乱了。

既然相对顺序是固定的,那么我就不需要去链接邻接矩阵与jcombobox了。只需要在改变景点信息的时候顺便将邻接矩阵中的数据改一下就行了。这样就可以保证对应关系。

第二,数据的赋值

两点间的距离默认应该是无限大,所以初始化的时候应该是Integer.INT_MAX。自己和自己是没有距离的,也就是0。这些工作都应该在初始化的时候做好。

有两点可以进行优化:一是目前的版本如果第一次输入数据,编辑框会将初始化的值显示在上面。其实这种情况还是留白比较好。二是既然自己跟自己没有距离,那么两个JCombobox就不应该出现一样的值。

3.5 修改两点间的距离


import javax.swing.*;
  import java.awt.*;
  import java.awt.event.ItemEvent;
  import java.awt.event.ItemListener;
  import java.awt.event.MouseAdapter;
  import java.awt.event.MouseEvent;
  import java.io.*;
  import java.util.ArrayList;
  import java.util.Iterator;
 import java.util.Set;
 import java.util.TreeMap;

public class CreateLength
{
   private JComboBox jComboBox1, jComboBox2;
   private JTextField jTextField;
   private ObjectInputStream objectInputStream1, objectInputStream2;
   private ObjectOutputStream objectOutputStream;
   private File lengthFile;
 private File pointFile;
   private double length[][];
   private Toolkit toolkit = Toolkit.getDefaultToolkit();

private TreeMap treeMap;
   private Set set;

private LengthInfo lengthInfo;
   private ArrayList arrayList;

public CreateLength(JFrame jFrame)
   {

lengthFile = new File("D://length.obj");
      pointFile = new File("D://point.obj");
       try
      {
           objectInputStream1 = new ObjectInputStream(new FileInputStream(pointFile));
        } catch (IOException e)
     {
          new mDialog("错误", "没有景点信息!", jFrame);
        }

try
       {
           objectInputStream2 = new ObjectInputStream(new FileInputStream(lengthFile));
          treeMap = (TreeMap) objectInputStream1.readObject();
           arrayList = (ArrayList) objectInputStream2.readObject();
      } catch (IOException e)
      {
         lengthInfo = new LengthInfo();
          lengthInfo.init();
          arrayList = new ArrayList();
            arrayList.add(lengthInfo);
           try
           {
              objectOutputStream = new ObjectOutputStream(new FileOutputStream(lengthFile));
             objectOutputStream.writeObject(arrayList);
               objectOutputStream.flush();
          } catch (IOException e1)
          {

}
      } catch (ClassNotFoundException e)
     {

}

frameInit();

}

public void frameInit()
  {
      JFrame jFrame = new JFrame();
        jFrame.setLayout(new FlowLayout());
      jFrame.setBounds((toolkit.getScreenSize().width - 350) / 2, (toolkit.getScreenSize().height - 200) / 2, 350, 200);

jTextField = new JTextField(27);
     jComboBox1 = new JComboBox();
        jComboBox1.setPreferredSize(new Dimension(270, 30));
      jComboBox2 = new JComboBox();
      jComboBox2.setPreferredSize(new Dimension(270, 30));

set = treeMap.keySet();
      Iterator iterator = set.iterator();
       while (iterator.hasNext())
      {
            String string = (String) iterator.next();
          jComboBox1.addItem(string);
         jComboBox2.addItem(string);
       }

int from = jComboBox1.getSelectedIndex();
      int to = jComboBox2.getSelectedIndex();

lengthInfo = (LengthInfo) arrayList.get(0);
      jTextField.setText(lengthInfo.getLength(from, to) + "");
       jComboBox1.addItemListener(new ItemListener()
        {
            @Override
            public void itemStateChanged(ItemEvent e)
            {
                jTextField.setText(lengthInfo.getLength(jComboBox1.getSelectedIndex(), jComboBox2.getSelectedIndex()) + "");
            }
        });
        jComboBox2.addItemListener(new ItemListener()
        {
            @Override
            public void itemStateChanged(ItemEvent e)
            {
                jTextField.setText(lengthInfo.getLength(jComboBox1.getSelectedIndex(), jComboBox2.getSelectedIndex()) + "");
            }
        });

JButton cancelButton = new JButton("取消");
        JButton okayButton = new JButton("确认");

cancelButton.addMouseListener(new MouseAdapter()
        {
            @Override
            public void mouseClicked(MouseEvent e)
            {
                jFrame.setVisible(false);
            }
        });
        okayButton.addMouseListener(new MouseAdapter()
        {
            @Override
            public void mouseClicked(MouseEvent e)
            {
                try
                {
                    double weight = Double.parseDouble(jTextField.getText().toString());
                    lengthInfo.editLength(jComboBox1.getSelectedIndex(), jComboBox2.getSelectedIndex(), weight);
                    objectOutputStream = new ObjectOutputStream(new FileOutputStream(lengthFile));
                    objectOutputStream.writeObject(arrayList);

new mDialog("成功", "数据修改成功!", jFrame);
                    jFrame.setVisible(false);
                } catch (NumberFormatException e1)
                {
                    e1.printStackTrace();
                    new mDialog("错误", "请输入正确信息!", jFrame);
                } catch (IOException e1)
                {
                    new mDialog("错误", "信息写入失败!", jFrame);
                }

}
        });

jFrame.add(jComboBox1);
        jFrame.add(jComboBox2);
        jFrame.add(jTextField);
        jFrame.add(cancelButton);
        jFrame.add(okayButton);
        jFrame.setVisible(true);
        jFrame.setResizable(false);
    }

public static void main(String[] args)
    {
        new CreateLength(new JFrame());
    }

}

我承认,这个我偷懒了,这个我直接用的是上一个类。不过话说过来,这俩不是差不多嘛(&acute;_`)

4.一般用户的操作菜单

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


import javax.swing.*;
 import java.awt.*;
 import java.awt.event.MouseAdapter;
 import java.awt.event.MouseEvent;

class NormalMenu
 {

private JFrame jFrame;
    private JButton visitButton, searchButton, okayButton;
    private Font font = new Font("微软雅黑", 1, 20);
    private Toolkit toolkit = Toolkit.getDefaultToolkit();

public NormalMenu()
    {
        jFrame = new JFrame("功能菜单");
        jFrame.setBounds((toolkit.getScreenSize().width - 250) / 2, (toolkit.getScreenSize().height - 200) / 2, 250, 200);
        jFrame.setLayout(new FlowLayout());
        visitButton = new JButton("1.浏览景点信息");
        visitButton.setFont(font);
        searchButton = new JButton("2.查询最短路径");
        searchButton.setFont(font);
        okayButton = new JButton("关闭");
        okayButton.setFont(font);

visitButton.addMouseListener(new MouseAdapter()
        {
            @Override
            public void mouseClicked(MouseEvent e)
            {
                new VisitPoint();
            }
        });

searchButton.addMouseListener(new MouseAdapter()
        {
            @Override
            public void mouseClicked(MouseEvent e)
            {
                new SearchLength();
            }
        });

okayButton.addMouseListener(new MouseAdapter()
        {
            @Override
            public void mouseClicked(MouseEvent e)
            {
                jFrame.setVisible(false);
            }
        });

jFrame.add(visitButton);
        jFrame.add(searchButton);
        jFrame.add(okayButton);
        jFrame.setResizable(false);
        jFrame.setVisible(true);

}

}

4.1 浏览景点信息


import javax.swing.*;
  import java.awt.*;
  import java.awt.event.ItemEvent;
  import java.awt.event.ItemListener;
  import java.awt.event.MouseAdapter;
  import java.awt.event.MouseEvent;
  import java.io.File;
  import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.util.Iterator;
import java.util.Set;
import java.util.TreeMap;
import java.util.TreeSet;

public class VisitPoint
{
    private JFrame jFrame;
    private JComboBox jComboBox;
  private JLabel jLabel;
   private JButton okayButton;
  private Toolkit toolkit = Toolkit.getDefaultToolkit();

private File file = new File("D://point.obj");
   private ObjectInputStream objectInputStream;

private TreeMap treeMap;
    private Set set;

public VisitPoint()
   {
        try
         {
            objectInputStream = new ObjectInputStream(new FileInputStream(file));
           jFrame = new JFrame();
      } catch (IOException e)
       {
           new mDialog("错误", "无景点信息文件!", jFrame);
      }
      frameInit();
   }

public void frameInit()
  {
        try
       {
           jFrame.setLayout(new BorderLayout());
          jFrame.setBounds((toolkit.getScreenSize().width - 350) / 2, (toolkit.getScreenSize().height - 250) / 2, 350, 250);

} catch (Exception e)
      {
           e.printStackTrace();
       }

jComboBox = new JComboBox();
      jComboBox.setPreferredSize(new Dimension(270,30));
       try
       {
          treeMap = (TreeMap) objectInputStream.readObject();
          set = treeMap.keySet();
       } catch (IOException e)
       {

} catch (ClassNotFoundException e)
       {

}
       Iterator iterator = set.iterator();
      while (iterator.hasNext())
       {
           jComboBox.addItem((String) iterator.next());
       }

jLabel = new JLabel();
      jLabel.setPreferredSize(new Dimension(270,20));
      jLabel.setFont(new Font("宋体", 1, 20));
       jLabel.setText((String) treeMap.get(jComboBox.getSelectedItem()));

jComboBox.addItemListener(new ItemListener()
     {
           @Override
           public void itemStateChanged(ItemEvent e)
            {
              jLabel.setText((String) treeMap.get(jComboBox.getSelectedItem()));
           }
       });

okayButton = new JButton("确定");
       okayButton.setFont(new Font("微软雅黑", 1, 20));
      okayButton.addMouseListener(new MouseAdapter()
       {

@Override
           public void mouseClicked(MouseEvent e)
          {
            jFrame.setVisible(false);
          }
      });
     jFrame.add(jComboBox,BorderLayout.NORTH);
        jFrame.add(jLabel,BorderLayout.CENTER);
        jFrame.add(okayButton,BorderLayout.SOUTH);
        jFrame.setResizable(false);
        jFrame.setVisible(true);
    }

public static void main(String[] args)
    {
        new VisitPoint();
    }
}

很简单,想不出啥需要强调的。

4.2查询任意两点间的最短路径


import javax.imageio.event.IIOReadProgressListener;
  import javax.swing.*;
  import java.awt.*;
  import java.awt.event.ItemEvent;
  import java.awt.event.ItemListener;
  import java.awt.event.MouseAdapter;
  import java.awt.event.MouseEvent;
  import java.io.File;
  import java.io.FileInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Set;
import java.util.TreeMap;

public class SearchLength
{
    private JFrame jFrame;
    private JComboBox jComboBox1, jComboBox2;
    private JLabel jLabel;
   private JButton jButton;

private ObjectInputStream objectInputStream1, objectInputStream2;
    private File lengthFile, pointFile;

private TreeMap treeMap;
   private ArrayList arrayList;
    private Set set;

private LengthInfo lengthInfo;

private Toolkit toolkit = Toolkit.getDefaultToolkit();

public SearchLength()
   {

jFrame = new JFrame();
        try
       {
           lengthFile = new File("D://length.obj");
          pointFile = new File("D://point.obj");
           objectInputStream1 = new ObjectInputStream(new FileInputStream(lengthFile));
           objectInputStream2 = new ObjectInputStream(new FileInputStream(pointFile));
            arrayList = (ArrayList) objectInputStream1.readObject();
           lengthInfo = (LengthInfo) arrayList.get(0);

treeMap = (TreeMap) objectInputStream2.readObject();

} catch (IOException e)
       {
            new mDialog("错误", "无景点信息!", jFrame);
      } catch (ClassNotFoundException e)
       {
           new mDialog("错误!", "文件信息错误!", jFrame);
        }

try
      {
          set = treeMap.keySet();
      } catch (NullPointerException e)
       {
           new mDialog("错误", "无道路长度信息!", jFrame);
      }

frameInit();
   }

public void frameInit()
   {
       jFrame.setLayout(new FlowLayout());
     jFrame.setBounds((toolkit.getScreenSize().width - 200) / 2, (toolkit.getScreenSize().height - 200) / 2, 400, 200);

jComboBox1 = new JComboBox();
      jComboBox1.setPreferredSize(new Dimension(180, 30));
        jComboBox1.setFont(new Font("微软雅黑", 1, 20));
       jComboBox2 = new JComboBox();
       jComboBox2.setPreferredSize(new Dimension(180, 30));
       jComboBox2.setFont(new Font("微软雅黑", 1, 20));

Iterator iterator = set.iterator();
     while (iterator.hasNext())
       {
          String string = (String) iterator.next();
          jComboBox1.addItem(string);
          jComboBox2.addItem(string);
       }
      jLabel = new JLabel();
       jLabel.setPreferredSize(new Dimension(350, 80));
       jLabel.setFont(new Font("微软雅黑", 1, 20));
       double str1 = lengthInfo.getMin(0, 1, treeMap);
      jComboBox1.addItemListener(new ItemListener()
       {
           @Override
            public void itemStateChanged(ItemEvent e)
            {
               double str1 = lengthInfo.getMin(jComboBox1.getSelectedIndex(), jComboBox2.getSelectedIndex(), treeMap);
                String str2 = lengthInfo.getStringBuilder();
                jLabel.setText("<html><body>" + "最优路径:  " + str2 + "<br>" + "里程:  " + str1 + "m" + "<body></html>");
            }
        });
        jComboBox2.addItemListener(new ItemListener()
        {
            @Override
            public void itemStateChanged(ItemEvent e)
            {
                double str1 = lengthInfo.getMin(jComboBox1.getSelectedIndex(), jComboBox2.getSelectedIndex(), treeMap);
                String str2 = lengthInfo.getStringBuilder();
                jLabel.setText("<html><body>" + "最优路径:  " + str2 + "<br>" + "里程:  " + str1 + "m" + "<body></html>");
            }
        });

jButton = new JButton("确定");
        jButton.addMouseListener(new MouseAdapter()
        {
            @Override
            public void mouseClicked(MouseEvent e)
            {
                jFrame.setVisible(false);
            }
        });

jFrame.add(jComboBox1);
        jFrame.add(jComboBox2);
        jFrame.add(jLabel);
        jFrame.add(jButton);
        jFrame.setResizable(false);
        jFrame.setVisible(true);
    }

}

这里面的代码主要就是界面。实质的工作没在这里面。

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

有个可以优化的:就拿上面那个图来说,这个路径其实是反的,因为算法最后用的是回溯,stringBuilder.append()也就是从后往前拼接的。要是正的就更好了。

还有,在JLabel中居然可以使用html的格式控制,上面的“最优路程”与“里程”的换行就是使用<br>实现的。

但是这里我有一个疑惑:字符串中的“<”“>”是显示不出来的。一开始想使用“<--”来间隔,最后无奈只能用“---”了。

5.后记

程序不算完美,有很多我已经意识到的bug和可以继续优化的点。但是好歹是自己的一次实践,也是非常有价值的。

idea工程文件:

https://github.com/0-0MrLonely/SourceCode/tree/master/Java/NaviDemo

来源:https://www.cnblogs.com/KangYh/p/10176269.html

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com