java校园导航_Java实现的具有GUI的校园导航系统

0.写在前面

2020-5-18 更新

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

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

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

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

4b663da7c2211a3fb39a66812491d429.png

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

10176269.html('ᴗ' )و

实验要求如下:

以我校为例,设计一个校园导航系统,主要为来访的客人提供信息查询。系统有两类登陆账号,一类是游客,使用该系统方便校内路线查询;一类是管理员,可以使用该系统查询校内路线,可对校园景点路线可编辑。

说简单点,就是给定一个地图数据,然后地图上有好几个点,每个点间有距离,这个程序提供了查询两点间最短路径的功能。当然,你可以为他增加很多细节,比如查看景点信息啊,后台的管理啊等等,这些都是加分项。

老师推荐使用C,其实题目也是这么要求的。但是使用C有几个比较麻烦的问题:

第一,要是只实现基本的功能用C的话肯定是没什么问题,但是要是想添枝加叶的话,C的代码就没法看了,写起来麻烦读起来也难受。

第二,地图是有地图数据的,要是用C的话一般人都会直接printf  N多行的地图吧,这也是一个比较麻烦的事儿。

思来想去,我决定还是用Java来做这个系统,最短路径用迪杰斯特拉算法。

其实我还是第一次用Java做一个功能比较多的程序,既然是第一次我就想做好点,做的与众不同点。于是,我为这个程序增加了注册登录、邀请码注册管理员系统。

1.客户端与服务端

题目中既然区分了一般用户与管理员的权限,不如在这上面发挥一下。

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 import javax.swing.*;2 import java.awt.*;3 importjava.awt.event.MouseAdapter;4 importjava.awt.event.MouseEvent;5 import java.io.*;6 importjava.net.Socket;7

8 public classClient9 {10 privateJFrame jFrame;11 privateJLabel accountLabel, passwdLabel, inviteLabel;12 privateJTextField accountText, passwdText, inviteText;13 private Toolkit toolkit =Toolkit.getDefaultToolkit();14 privateJPanel accountJPanel, passwdJPanel, buttonjPanel, invitejPanel;15 privateJButton loginButton, registButton;16 static JDialog jDialog=newJDialog();17

18 private Font font = new Font("微软雅黑", 1, 18);19

20 privateBufferedWriter bufferedWriter;21 privateBufferedReader bufferedReader;22

23 privateString account, passwd;24 privateString tips;25 private boolean isAdmin = false;26

27 publicClient()28 {29 init();30 }31

32 public voidinit()33 {34 jFrame = new JFrame("用户登录");35 jFrame.setLayout(newFlowLayout());36 jFrame.setBounds((toolkit.getScreenSize().width - 270) / 2, (toolkit.getScreenSize().height - 200) / 2, 270, 200);37

38 componentInit(accountJPanel = new JPanel(), accountLabel = new JLabel(), accountText = new JTextField(), " 帐号");39 componentInit(passwdJPanel = new JPanel(), passwdLabel = new JLabel(), passwdText = new JTextField(), " 密码");40 componentInit(invitejPanel = new JPanel(), inviteLabel = new JLabel(), inviteText = new JTextField(), "邀请码");41

42 loginButtonInit();43 registButtonInit();44

45 jFrame.setVisible(true);46 jFrame.setResizable(false);47

48 }49

50 public voidcomponentInit(JPanel jPanel, JLabel jLabel, JTextField jTextField, String str)51 {52 jPanel.setLayout(newFlowLayout());53

54 jLabel.setText(str);55 jLabel.setFont(font);56

57 jTextField.setText("");58 jTextField.setColumns(14);59

60 jPanel.add(jLabel);61 jPanel.add(jTextField);62

63 jFrame.add(jPanel);64 }65

66 public voidloginButtonInit()67 {68 loginButton = new JButton("登录");69

70 loginButton.addMouseListener(newMouseAdapter()71 {72 @Override73 public voidmouseClicked(MouseEvent e)74 {75 try

76 {77 Socket socket = new Socket("localhost", 10001);78 //每点击一次必须新建一个新的Socket,否则无法一直获取服务端的数据,具体原因不明,日后考证

79 sendInfo(0, socket);80 if (tips.contains("成功"))81 {82 Home home = newHome(isAdmin);83 }84 } catch(IOException e1)85 {86 e1.printStackTrace();87 }88

89 }90 });91 jFrame.add(loginButton);92 }93

94 public voidregistButtonInit()95 {96 registButton = new JButton("注册");97 registButton.addMouseListener(newMouseAdapter()98 {99 @Override100 public voidmouseClicked(MouseEvent e)101 {102 try

103 {104 Socket socket = new Socket("localhost", 10001);105 sendInfo(1, socket);106 } catch(IOException e1)107 {108 e1.printStackTrace();109 }110

111 }112 });113 jFrame.add(registButton);114 }115

116 public void sendInfo(int code, Socket socket)//封装了注册登录的共性方法

117 {118

119 account =accountText.getText();120 passwd =passwdText.getText();121 String string;122 if (code == 0)123 {124 string = "登录";125 }126 else

127 string = "注册";128 try

129 {130 bufferedWriter = new BufferedWriter(newOutputStreamWriter(socket.getOutputStream()));131 //这里同样要使用每次的新的Socket获取写入流

132

133 bufferedWriter.write(code + "\r\n");134 bufferedWriter.flush();//输出标示,告诉服务端是登录还是注册,登录为0,注册为1

135

136 bufferedWriter.write(account + "\r\n");//必须要有结束标示,否则服务端不会停止读取

137 bufferedWriter.flush(); //刷新流

138 bufferedWriter.write(passwd + "\r\n");139 bufferedWriter.flush();140 if (code == 1) //注册的话有一个邀请码,需要多传输一次

141 {142 bufferedWriter.write(inviteText.getText() + "\r\n");143 bufferedWriter.flush();144 }145 bufferedReader = new BufferedReader(newInputStreamReader(socket.getInputStream()));146 tips =bufferedReader.readLine();147 if (tips.contains("管理员"))148 {149 isAdmin = true;150 }151 } catch(IOException e1)152 {153 new mDialog(string + "结果", "交换数据失败!",jFrame);154

155 } catch(NullPointerException e1)156 {157 new mDialog(string + "结果", "服务端关闭!请先打开服务端!",jFrame);158 } finally

159 {160 try

161 {162 bufferedReader.close();163 bufferedWriter.close();164 } catch(IOException e1)165 {166 tips = "流关闭失败!";167 new mDialog(string + "结果", tips,jFrame);168 }169 new mDialog(string + "结果", tips,jFrame);170 }171 }172

173

174

175

176

177 public static voidmain(String[] args)178 {179 Client client = newClient();180 }181

182 }

Client.java

运用了Socket,并与Server交换数据。

详细解释不再说,注释里有,也没什么好说的,比较基础的代码。

这里有个bug没解决(主要是没精力也懒得改了):注册成功后立刻点击登录的话会无视注册身份,统一使用管理员身份,重启客户端之后正常。我似乎隐约知道是哪里的问题?

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 importcom.sun.source.tree.Scope;2

3 import java.io.*;4 importjava.net.ServerSocket;5 importjava.net.Socket;6 importjava.util.HashSet;7 importjava.util.Iterator;8

9 public classServer10 {11 privateSocket socket;12 privateServerSocket serverSocket;13 privateString ipInfo;14 privateBufferedReader bufferedReader;15 privateBufferedOutputStream bufferedOutputStream;16 privateFileOutputStream fileOutputStream;17 privateString adminKey;18 private HashSethashSet;19 privateString account, passwd, inviteCode;20 private File infofile = new File("D://info.key");21 private boolean isAdmin = false;22

23

24 publicServer(String adminKey)25 {26 this.adminKey =adminKey;27 try

28 {29 serverSocket = new ServerSocket(10001);30 while (true)//循环接受Socket

31 {32 System.out.println("服务端开启,等待客户端建立连接。");33 socket =serverSocket.accept();34 ipInfo =socket.getInetAddress().getHostAddress().toString();35 System.out.println(ipInfo+" Connected! ");36 new Thread(new Task(socket)).start();//并且每次接收到Socket之后,就要新建一个线程以达到多次返回数据接受数据的目的

37 }38 } catch(IOException e)39 {40 e.printStackTrace();41 }42

43 }44

45 public class Task implementsRunnable46 {47 privateSocket socket;48

49 publicTask(Socket socket)50 {51 this.socket =socket;52 }53

54 @Override55 public voidrun()56 {57 try

58 {59 bufferedReader = new BufferedReader(newInputStreamReader(socket.getInputStream()));60 System.out.println(ipInfo);61 String code = bufferedReader.readLine();//客户端先发送一个标志,说明是登录还是返回

62 if (code.equals("0"))63 {64 login();65 }66 else

67 regist();68 code =bufferedReader.readLine();69 System.out.println(code);70 } catch(IOException e)71 {72 e.printStackTrace();73 }74 }75 }76

77

78 public voidlogin()79 {80 String result;81 String status;82 PrintWriter printWriter = null;83 if (isAdmin)//确定找到的用户的身份

84 {85 status = "管理员";86 }87 else

88

89 status = "一般用户";90 try

91 {92 readFile(infofile);//先读文件

93 account = bufferedReader.readLine();//客户端传回来的帐号密码

94 passwd =bufferedReader.readLine();95 User user = new User(account, passwd);//封装对象

96 if (isExists(user, false))//找到了

97 {98 result = "登录成功,身份:" + status;//传回相关信息

99 }100 else

101 {102 result = "登录失败,请查验帐号密码!";103 }104 printWriter = new PrintWriter(socket.getOutputStream(), true);105 printWriter.println(result);//返回客户端

106 } catch(IOException e)107 {108 e.printStackTrace();109 }110 }111

112 public voidregist()113 {114 PrintWriter printWriter = null;115 String status = null;116 try

117 {118 printWriter = new PrintWriter(socket.getOutputStream(), true);119 account = bufferedReader.readLine();//客户端传回来的帐号密码

120 passwd =bufferedReader.readLine();121 inviteCode =bufferedReader.readLine();122

123 User user = newUser(account, passwd);124 readFile(infofile);125 if (!isExists(user, true))126 {127 user.setAdmin(inviteCode);128 if(user.isAdmin())129 {130 status = "管理员";131 }132 else

133 status = "一般用户";134

135 hashSet.add(user);//没找到就添加进Set

136 writeFile(infofile);137 printWriter.println("注册成功!身份:" +status);138 }139 else

140 {141 printWriter.println("注册失败,用户已存在!");142 }143 } catch(IOException e)144 {145 e.printStackTrace();146 }147

148 }149

150 public voidreadFile(File file)151 {152 ObjectInputStream objectInputStream = null;153 PrintWriter printWriter = null;154 try

155 {156 printWriter = newPrintWriter(socket.getOutputStream());157 objectInputStream = new ObjectInputStream(new FileInputStream(file));//读取密码文件

158 hashSet = (HashSet) objectInputStream.readObject();//信息是以hashSet的形式存放在文件中

159 } catch(IOException e)160 {161 if (hashSet == null)162 {163 hashSet = new HashSet<>();//程序第一次运行时添加进的hashMap是null,需要新实例化一个

164 writeFile(infofile);//然后再写进去

165 }166 } catch(ClassNotFoundException e)167 {168 printWriter.println("数据文件异常,请检查文件!");169 }170 }171

172 public voidwriteFile(File file)173 {174 PrintWriter printWriter = null;175 ObjectOutputStream objectOutputStream = null;176 try

177 {178 objectOutputStream = new ObjectOutputStream(new FileOutputStream(file));//对象写入流

179 objectOutputStream.writeObject(hashSet);//将hashSet写入文件

180 printWriter = newPrintWriter(socket.getOutputStream());181 } catch(IOException e)182 {183 printWriter.println("数据文件异常,请检查文件!");184 }185 }186

187 public boolean isExists(User user, booleanisRegister)188 {189 String account =user.getAccount();190 String passwd =user.getPasswd();191 Iterator iterator =hashSet.iterator();192 while(iterator.hasNext())193 {194 User stu =(User) iterator.next();195 isAdmin =stu.isAdmin();196 if (stu.getAccount().equals(account))//如果找到了相同用户名

197 {198 if (isRegister)//注册的话

199 {200 return true;//已经找到了

201 }202 return stu.getPasswd().equals(passwd);//登陆的话还要比较密码是否相同

203 }204 }205 return false;//没找到就是假

206 }207

208

209 public voidsetAdminKey(String string)210 {211 adminKey =string;212 }213

214 publicString getAdminKey()215 {216 returnadminKey;217 }218

219 public static voidmain(String[] args)220 {221 Server server = new Server("KangYh is very handsome!");222

223 }224 }225

226 class User implementsSerializable227 {228 privateString account;229 privateString passwd;230 private boolean isAdmin = false;231

232 publicUser(String account, String passwd)233 {234 this.account =account;235 this.passwd =passwd;236 }237

238 publicString getAccount()239 {240 returnaccount;241 }242

243 public voidsetAccount(String account)244 {245 this.account =account;246 }247

248 publicString getPasswd()249 {250 returnpasswd;251 }252

253 public voidsetPasswd(String passwd)254 {255 this.passwd =passwd;256 }257

258 public booleanisAdmin()259 {260 returnisAdmin;261 }262

263 public voidsetAdmin(String string)264 {265 if (string.equals(new Server("KangYh is very handsome!").getAdminKey()))266 {267 isAdmin = true;268 }269 }270

271 @Override272 public inthashCode()273 {274 return account.hashCode() + passwd.hashCode() * 3;275 }276

277 @Override278 public booleanequals(Object obj)279 {280 if (!(obj instanceofUser))281 {282 return false;283 }284 User user =(User) obj;285 returnaccount.equals(user.account);286 }287 }

Server.java

服务端,里面有User.class。其实可以把这个class写出来的。把User装入HashSet,保证唯一性。

这里面踩的雷就是读写的换行,刷新问题。写入完毕一次必须再写一个换行标记,否则另一头是没数据的。换行标记可以是

1 bufferedWriter.write(code + "\r\n");2 bufferedWriter.newLine();

两者中的一种。

还有一点,序列化的对象文件,官方推荐扩展名为.ser,我用的是.obj。

放张截图:(请无视邀请码内容(゜ロ゜))

754366b9e914d12d4e2c1f3f319d5b41.png

2.主界面

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

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 import javax.swing.*;2 import java.awt.*;3 importjava.awt.event.MouseAdapter;4 importjava.awt.event.MouseEvent;5 import java.io.*;6

7

8 public classHome9 {10 privateJFrame jFrame;11 privateJPanel mapLabel;12 privateJLabel title, map;13 privateJButton admin, menu, close;14 private Font titleFont = new Font("微软雅黑", 1, 28);15 private Font charFont = new Font("微软雅黑", 1, 20);16 private Toolkit toolkit =Toolkit.getDefaultToolkit();17

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

22 private boolean isAdmin = false;23

24 public Home(booleanisAdmin)25 {26 this.isAdmin = isAdmin;//确定用户身份

27 init();28 }29

30 public voidinit()31 {32 jFrame = newJFrame();33 jFrame.setLayout(newBorderLayout());34

35 titleInit();//初始化标题栏

36 mapInit();//初始化地图

37

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

40 JPanel buttonPanel = newJPanel();41 buttonPanel.setLayout(newFlowLayout());42

43 admin = new JButton("管理员菜单");44 admin.setFont(charFont);45 admin.addMouseListener(newMouseAdapter()46 {47 @Override48 public voidmouseClicked(MouseEvent e)49 {50 newAdminMenu();51 }52 });53

54 menu = new JButton("功能菜单");55 menu.setFont(charFont);56 menu.addMouseListener(newMouseAdapter()57 {58 @Override59 public voidmouseClicked(MouseEvent e)60 {61 newNormalMenu();62 }63 });64 buttonPanel.add(menu);65 if(isAdmin)66 {67 buttonPanel.add(admin);68 adminTips();69 }70 close = new JButton("关闭");71 close.setFont(charFont);72 close.addMouseListener(newMouseAdapter()73 {74 @Override75 public voidmouseClicked(MouseEvent e)76 {77 System.exit(0);78 }79 });80 buttonPanel.add(close);81

82 jFrame.add(buttonPanel, BorderLayout.SOUTH);83

84 jFrame.setResizable(false);85 jFrame.setVisible(true);86 }87

88 public voidtitleInit()89 {90 title = new JLabel("校园导航系统", SwingConstants.CENTER);91 title.setFont(titleFont);92 jFrame.add(title, BorderLayout.NORTH);//标题文字

93 }94

95 public voidmapInit()96 {97 ImageIcon imageIcon = newImageIcon(mapFile.getPath());98 imageIcon.setImage(imageIcon.getImage().getScaledInstance(imageIcon.getIconWidth(),99 imageIcon.getIconHeight(), Image.SCALE_DEFAULT));100 map = newJLabel();101 map.setBounds(0, 0, 690, 400);102 map.setHorizontalAlignment(0);103 map.setIcon(imageIcon);104 mapLabel = newJPanel();105 mapLabel.setSize(690, 400);106 mapLabel.add(map);107 jFrame.add(mapLabel, BorderLayout.CENTER);//地图显示

108 }109

110

111 public voidadminTips()112 {113 String errorTitle = "数据错误!";114 try

115 {116 checkFile(mapFile, "地图");117 } catch(IOException e)118 {119 e.printStackTrace();120 new mDialog(errorTitle, "请管理员先录入地图数据!", jFrame);121 //writeMap

122 }123 try

124 {125 checkFile(pointFile, "景点");126

127 } catch(IOException e)128 {129 e.printStackTrace();130 new mDialog(errorTitle, "请管理员先录入景点数据!", jFrame);131 //writePoint

132 }133 try

134 {135 checkFile(lengthFile, "距离");136

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

142 }143 }144

145 public void checkFile(File file, String string) throwsIOException146 {147 if (!file.exists() || file.length() == 0)148 {149 throw new IOException(string + "文件打开失败!");150 }151 }152

153

154 }

Home.java

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

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

a2d1882c85fb2790c76201cc103e2c87.png

941700d9f880522038a67f2f6c055032.png

84533b9321b1f7f2b3600f9e36a2d724.png

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

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

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

3ac0d43141ea87e369c523533f8bce4c.png

6d6b09c031b04fe988df66be1930d8ba.png

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

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 import javax.swing.*;2 import java.awt.*;3 importjava.awt.event.MouseAdapter;4 importjava.awt.event.MouseEvent;5 importjava.io.BufferedReader;6 importjava.io.BufferedWriter;7 importjava.io.File;8

9 public classAdminMenu10 {11 privateJFrame jFrame;12 privateJButton createPoint, editPoint, deletePoint, createLength, editLength;13 privateJButton cancelButton;14 private Toolkit toolkit =Toolkit.getDefaultToolkit();15 private Font font = new Font("微软雅黑", 1, 20);16 private File pointFile = new File("D://point.txt");17 private File lengthFile = new File("D://length.txt");18 privateJFrame childFrame;19 privateJPanel childPanel;20

21 privateBufferedReader bufferedReader;22 privateBufferedWriter bufferedWriter;23

24

25 publicAdminMenu()26 {27 jFrame = new JFrame("管理员菜单");28 jFrame.setBounds((toolkit.getScreenSize().width - 250) / 2, (toolkit.getScreenSize().height - 310) / 2, 250, 310);29 jFrame.setLayout(newFlowLayout());30

31 childPanel = newJPanel();32 childPanel.setLayout(newFlowLayout());33 cancelButton = new JButton("关闭");34 childPanel.add(cancelButton);35

36

37 cancelButton.addMouseListener(newMouseAdapter()38 {39 @Override40 public voidmouseClicked(MouseEvent e)41 {42 jFrame.setVisible(false);43 }44 });45

46 createPoint = new JButton("1.创建景点信息");47 createPoint.setFont(font);48 createPoint.addMouseListener(newMouseAdapter()49 {50 @Override51 public voidmouseClicked(MouseEvent e)52 {53 newCreatePoint();54 }55 });56

57 editPoint = new JButton("2.修改景点信息");58 editPoint.setFont(font);59 editPoint.addMouseListener(newMouseAdapter()60 {61 @Override62 public voidmouseClicked(MouseEvent e)63 {64 newEditPoint();65 }66 });67

68 deletePoint = new JButton("3.删除景点信息");69 deletePoint.setFont(font);70 deletePoint.addMouseListener(newMouseAdapter()71 {72 @Override73 public voidmouseClicked(MouseEvent e)74 {75 newDeletePoint();76 }77 });78

79 createLength = new JButton("4.创建道路信息");80 createLength.setFont(font);81 createLength.addMouseListener(newMouseAdapter()82 {83 @Override84 public voidmouseClicked(MouseEvent e)85 {86 newCreateLength(jFrame);87 }88 });89

90 editLength = new JButton("5.修改道路信息");91 editLength.setFont(font);92 editLength.addMouseListener(newMouseAdapter()93 {94 @Override95 public voidmouseClicked(MouseEvent e)96 {97 newCreateLength(jFrame);98 }99 });100

101 jFrame.add(createPoint);102 jFrame.add(editPoint);103 jFrame.add(deletePoint);104 jFrame.add(createLength);105 jFrame.add(editLength);106 jFrame.add(childPanel);107 jFrame.setVisible(true);108 }109

110

111 }

AdminMenu.java

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 import javax.swing.*;2 import java.awt.*;3 importjava.awt.event.MouseAdapter;4 importjava.awt.event.MouseEvent;5

6 classNormalMenu7 {8

9 privateJFrame jFrame;10 privateJButton visitButton, searchButton, okayButton;11 private Font font = new Font("微软雅黑", 1, 20);12 private Toolkit toolkit =Toolkit.getDefaultToolkit();13

14 publicNormalMenu()15 {16 jFrame = new JFrame("功能菜单");17 jFrame.setBounds((toolkit.getScreenSize().width - 250) / 2, (toolkit.getScreenSize().height - 200) / 2, 250, 200);18 jFrame.setLayout(newFlowLayout());19 visitButton = new JButton("1.浏览景点信息");20 visitButton.setFont(font);21 searchButton = new JButton("2.查询最短路径");22 searchButton.setFont(font);23 okayButton = new JButton("关闭");24 okayButton.setFont(font);25

26

27 visitButton.addMouseListener(newMouseAdapter()28 {29 @Override30 public voidmouseClicked(MouseEvent e)31 {32 newVisitPoint();33 }34 });35

36 searchButton.addMouseListener(newMouseAdapter()37 {38 @Override39 public voidmouseClicked(MouseEvent e)40 {41 newSearchLength();42 }43 });44

45 okayButton.addMouseListener(newMouseAdapter()46 {47 @Override48 public voidmouseClicked(MouseEvent e)49 {50 jFrame.setVisible(false);51 }52 });53

54 jFrame.add(visitButton);55 jFrame.add(searchButton);56 jFrame.add(okayButton);57 jFrame.setResizable(false);58 jFrame.setVisible(true);59

60 }61

62 }

NormalMenu.java

两个菜单的java文件。

3.管理员菜单

管理员有5个功能。

ef2ab4724bb356d808f25519a62ee337.png

3.1创建景点信息

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 import javax.swing.*;2 import java.awt.*;3 importjava.awt.event.MouseAdapter;4 importjava.awt.event.MouseEvent;5 import java.io.*;6 importjava.util.TreeMap;7

8 public classCreatePoint9 {10 privateFile file;11 privateObjectInputStream objectInputStream;12 privateObjectOutputStream objectOutputStream;13 privateTreeMap treeMap;14 private Toolkit toolkit =Toolkit.getDefaultToolkit();15

16 publicCreatePoint()17 {18 try

19 {20 file = new File("D://point.obj");21 objectInputStream = new ObjectInputStream(newFileInputStream(file));22 treeMap =(TreeMap) objectInputStream.readObject();23 } catch(IOException e)24 {25 treeMap = newTreeMap();26 } catch(ClassNotFoundException e)27 {28 }finally

29 {30 frameInit();31 }32

33 }34

35 public voidframeInit()36 {37 JSeparator jSeparator = newJSeparator(SwingConstants.HORIZONTAL);38 JTextArea jTextArea = new JTextArea(15, 30);39 JTextField jTextField = new JTextField(20);40

41 JFrame jFrame = newJFrame();42 jFrame.setBounds((toolkit.getScreenSize().width - 350) / 2, (toolkit.getScreenSize().height - 450) / 2, 350, 450);43 jFrame.setLayout(newFlowLayout());44

45 jFrame.add(jTextField);46 jFrame.add(jSeparator);47 jFrame.add(jTextArea);48

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

52 cancelButton.addMouseListener(newMouseAdapter()53 {54 @Override55 public voidmouseClicked(MouseEvent e)56 {57 jFrame.setVisible(false);58 }59 });60 okayButton.addMouseListener(newMouseAdapter()61 {62 @Override63 public voidmouseClicked(MouseEvent e)64 {65 treeMap.put(jTextField.getText(), jTextArea.getText());66 try

67 {68 objectOutputStream = new ObjectOutputStream(newFileOutputStream(file));69 objectOutputStream.writeObject(treeMap);70 new mDialog("成功", "数据正常保存", jFrame);71 jFrame.setVisible(false);72 } catch(IOException e1)73 {74 new mDialog("失败", "数据异常!", jFrame);75 }76 }77 });78 jFrame.add(cancelButton);79 jFrame.add(okayButton);80 jFrame.setVisible(true);81

82

83 }84

85 public static voidmain(String[] args)86 {87 newCreatePoint();88 }89

90

91 }

CreatePoint.java

bf8cdb19d36530fa4f15a9e36c94fd37.png

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

3.2 修改景点信息

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 import javax.swing.*;2 import java.awt.*;3 importjava.awt.event.ItemEvent;4 importjava.awt.event.ItemListener;5 importjava.awt.event.MouseAdapter;6 importjava.awt.event.MouseEvent;7 import java.io.*;8 importjava.util.TreeMap;9 importjava.util.Iterator;10 importjava.util.Set;11

12 public classEditPoint13 {14 privateJComboBox jComboBox;15 privateString key;16 privateObjectInputStream objectInputStream;17 privateObjectOutputStream objectOutputStream;18 privateTreeMap treeMap;19 private Setset;20 privateFile file;21 private Toolkit toolkit =Toolkit.getDefaultToolkit();22 JFrame jFrame;23

24 publicEditPoint()25 {26 try

27 {28 file = new File("D://point.obj");29 jFrame = new JFrame("");30 objectInputStream = new ObjectInputStream(newFileInputStream(file));31 treeMap =(TreeMap) objectInputStream.readObject();32 set =treeMap.keySet();33 frameInit();34 } catch(IOException e)35 {36 new mDialog("错误", "没有文件!", jFrame);37 e.printStackTrace();38 } catch(ClassNotFoundException e)39 {40 e.printStackTrace();41 }42 }43

44 public voidframeInit()45 {46

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

49 jFrame.setLayout(newFlowLayout());50

51 jComboBox = newJComboBox();52 jComboBox.setPreferredSize(new Dimension(270, 30));53 Iterator iterator =set.iterator();54 while(iterator.hasNext())55 {56 jComboBox.addItem((String) iterator.next());57 }58 JTextArea jTextArea = new JTextArea(15, 30);59 jTextArea.setText((String) treeMap.get(jComboBox.getSelectedItem()));60

61 jComboBox.addItemListener(newItemListener()62 {63 @Override64 public voiditemStateChanged(ItemEvent e)65 {66 jTextArea.setText((String) treeMap.get(jComboBox.getSelectedItem()));67 }68 });69 JButton okayButton = new JButton("确定");70 JButton cancelButton = new JButton("取消");71 cancelButton.addMouseListener(newMouseAdapter()72 {73 @Override74 public voidmouseClicked(MouseEvent e)75 {76 jFrame.setVisible(false);77 }78 });79 okayButton.addMouseListener(newMouseAdapter()80 {81 @Override82 public voidmouseClicked(MouseEvent e)83 {84 String string =jTextArea.getText();85 treeMap.put((String) jComboBox.getSelectedItem(), string);86 try

87 {88 objectOutputStream = new ObjectOutputStream(newFileOutputStream(file));89 objectOutputStream.writeObject(treeMap);90 new mDialog("成功", "数据成功修改", jFrame);91 jFrame.setVisible(false);92 } catch(IOException e1)93 {94 new mDialog("失败", "数据异常!", jFrame);95 }96

97 }98 });99 jFrame.add(jComboBox);100 jFrame.add(jTextArea);101 jFrame.add(cancelButton);102 jFrame.add(okayButton);103 jFrame.setResizable(false);104 jFrame.setVisible(true);105 }106

107 public static voidmain(String[] args)108 {109 newEditPoint();110 }111 }

EditPoint.java

8bcd9101eee34c1a04fd1b9e68c4972a.png

3.3 删除景点信息

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 import javax.swing.*;2 import java.awt.*;3 importjava.awt.event.ItemEvent;4 importjava.awt.event.ItemListener;5 importjava.awt.event.MouseAdapter;6 importjava.awt.event.MouseEvent;7 import java.io.*;8 importjava.util.TreeMap;9 importjava.util.Iterator;10 importjava.util.Set;11

12 public classDeletePoint13 {14 privateJComboBox jComboBox;15 privateTreeMap treeMap;16 privateObjectInputStream objectInputStream;17 privateObjectOutputStream objectOutputStream;18 privateSet set;19 privateFile file;20 private Toolkit toolkit =Toolkit.getDefaultToolkit();21 privateJFrame jFrame;22

23 publicDeletePoint()24 {25 try

26 {27 jFrame = newJFrame();28 file = new File("D://point.obj");29 objectInputStream = new ObjectInputStream(newFileInputStream(file));30 treeMap =(TreeMap) objectInputStream.readObject();31 frameInit();32 } catch(IOException e)33 {34 new mDialog("错误", "没有文件!", jFrame);35 e.printStackTrace();36

37 } catch(ClassNotFoundException e)38 {39 e.printStackTrace();40 }41 }42

43 public voidframeInit()44 {45 jFrame.setLayout(newFlowLayout());46 jFrame.setBounds((toolkit.getScreenSize().width - 350) / 2, (toolkit.getScreenSize().height - 250) / 2, 350, 250);47

48 jComboBox = newJComboBox();49 jComboBox.setPreferredSize(new Dimension(270,30));//设置大小

50 jFrame.add(jComboBox);51 set =treeMap.keySet();52 Iterator iterator =set.iterator();53 while(iterator.hasNext())54 {55 jComboBox.addItem((String) iterator.next());56 }57

58 JLabel jLabel = newJLabel();59 jLabel.setText((String)treeMap.get(jComboBox.getSelectedItem()));//设置景点的相关信息显示

60 jLabel.setPreferredSize(new Dimension(270,80));61 jFrame.add(jLabel);62

63 JButton cancelButton = new JButton("取消");64 JButton okayButton = new JButton("确认");65 jFrame.add(cancelButton);66 jFrame.add(okayButton);67

68

69 jComboBox.addItemListener(newItemListener()70 {71 @Override72 public voiditemStateChanged(ItemEvent e)73 {74 jLabel.setText((String)treeMap.get(jComboBox.getSelectedItem()));75 }76 });77

78 cancelButton.addMouseListener(newMouseAdapter()79 {80 @Override81 public voidmouseClicked(MouseEvent e)82 {83 jFrame.setVisible(false);84 }85 });86 okayButton.addMouseListener(newMouseAdapter()87 {88 @Override89 public voidmouseClicked(MouseEvent e)90 {91 try

92 {93 treeMap.remove((String) jComboBox.getSelectedItem());94

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

106 jFrame.setVisible(false);107 }108 }109 });110

111 jFrame.setResizable(false);112 jFrame.setVisible(true);113 }114

115 public static voidmain(String[] args)116 {117 newDeletePoint();118 }119 }

DeletePoint.java

69f5ed1e6aa2410b32100a1a0ce1737a.png

3.4 创建两点间的距离信息

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 import javax.swing.*;2 import java.awt.*;3 importjava.awt.event.ItemEvent;4 importjava.awt.event.ItemListener;5 importjava.awt.event.MouseAdapter;6 importjava.awt.event.MouseEvent;7 import java.io.*;8 importjava.util.ArrayList;9 importjava.util.Iterator;10 importjava.util.Set;11 importjava.util.TreeMap;12

13 public classCreateLength14 {15 privateJComboBox jComboBox1, jComboBox2;16 privateJTextField jTextField;17 privateObjectInputStream objectInputStream1, objectInputStream2;18 privateObjectOutputStream objectOutputStream;19 privateFile lengthFile;20 privateFile pointFile;21 private doublelength[][];22 private Toolkit toolkit =Toolkit.getDefaultToolkit();23

24 privateTreeMap treeMap;25 privateSet set;26

27 privateLengthInfo lengthInfo;28 privateArrayList arrayList;29

30 publicCreateLength(JFrame jFrame)31 {32

33 lengthFile = new File("D://length.obj");34 pointFile = new File("D://point.obj");35 try

36 {37 objectInputStream1 = new ObjectInputStream(newFileInputStream(pointFile));38 } catch(IOException e)39 {40 new mDialog("错误", "没有景点信息!", jFrame);41 }42

43

44 try

45 {46 objectInputStream2 = new ObjectInputStream(newFileInputStream(lengthFile));47 treeMap =(TreeMap) objectInputStream1.readObject();48 arrayList =(ArrayList) objectInputStream2.readObject();49 } catch(IOException e)50 {51 lengthInfo = newLengthInfo();52 lengthInfo.init();53 arrayList = newArrayList();54 arrayList.add(lengthInfo);55 try

56 {57 objectOutputStream = new ObjectOutputStream(newFileOutputStream(lengthFile));58 objectOutputStream.writeObject(arrayList);59 objectOutputStream.flush();60 } catch(IOException e1)61 {62

63 }64 } catch(ClassNotFoundException e)65 {66

67 }68

69 frameInit();70

71

72 }73

74 public voidframeInit()75 {76 JFrame jFrame = newJFrame();77 jFrame.setLayout(newFlowLayout());78 jFrame.setBounds((toolkit.getScreenSize().width - 350) / 2, (toolkit.getScreenSize().height - 200) / 2, 350, 200);79

80 jTextField = new JTextField(27);81 jComboBox1 = newJComboBox();82 jComboBox1.setPreferredSize(new Dimension(270, 30));83 jComboBox2 = newJComboBox();84 jComboBox2.setPreferredSize(new Dimension(270, 30));85

86 set =treeMap.keySet();87 Iterator iterator =set.iterator();88 while(iterator.hasNext())89 {90 String string =(String) iterator.next();91 jComboBox1.addItem(string);92 jComboBox2.addItem(string);93 }94

95 int from =jComboBox1.getSelectedIndex();96 int to =jComboBox2.getSelectedIndex();97

98 lengthInfo = (LengthInfo) arrayList.get(0);99 jTextField.setText(lengthInfo.getLength(from, to) + "");100 jComboBox1.addItemListener(newItemListener()101 {102 @Override103 public voiditemStateChanged(ItemEvent e)104 {105 jTextField.setText(lengthInfo.getLength(jComboBox1.getSelectedIndex(), jComboBox2.getSelectedIndex()) + "");106 }107 });108 jComboBox2.addItemListener(newItemListener()109 {110 @Override111 public voiditemStateChanged(ItemEvent e)112 {113 jTextField.setText(lengthInfo.getLength(jComboBox1.getSelectedIndex(), jComboBox2.getSelectedIndex()) + "");114 }115 });116

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

120

121 cancelButton.addMouseListener(newMouseAdapter()122 {123 @Override124 public voidmouseClicked(MouseEvent e)125 {126 jFrame.setVisible(false);127 }128 });129 okayButton.addMouseListener(newMouseAdapter()130 {131 @Override132 public voidmouseClicked(MouseEvent e)133 {134 try

135 {136 double weight =Double.parseDouble(jTextField.getText().toString());137 lengthInfo.editLength(jComboBox1.getSelectedIndex(), jComboBox2.getSelectedIndex(), weight);138 objectOutputStream = new ObjectOutputStream(newFileOutputStream(lengthFile));139 objectOutputStream.writeObject(arrayList);140

141 new mDialog("成功", "数据修改成功!", jFrame);142 jFrame.setVisible(false);143 } catch(NumberFormatException e1)144 {145 e1.printStackTrace();146 new mDialog("错误", "请输入正确信息!", jFrame);147 } catch(IOException e1)148 {149 new mDialog("错误", "信息写入失败!", jFrame);150 }151

152

153 }154 });155

156 jFrame.add(jComboBox1);157 jFrame.add(jComboBox2);158 jFrame.add(jTextField);159 jFrame.add(cancelButton);160 jFrame.add(okayButton);161 jFrame.setVisible(true);162 jFrame.setResizable(false);163 }164

165 public static voidmain(String[] args)166 {167 new CreateLength(newJFrame());168 }169

170 }

CreateLength.java

dd64e29e5a98e90863029dd651ff6746.png

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

第一,存储结构。

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

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

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

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

第二,数据的赋值

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

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

3.5 修改两点间的距离

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 import javax.swing.*;2 import java.awt.*;3 importjava.awt.event.ItemEvent;4 importjava.awt.event.ItemListener;5 importjava.awt.event.MouseAdapter;6 importjava.awt.event.MouseEvent;7 import java.io.*;8 importjava.util.ArrayList;9 importjava.util.Iterator;10 importjava.util.Set;11 importjava.util.TreeMap;12

13 public classCreateLength14 {15 privateJComboBox jComboBox1, jComboBox2;16 privateJTextField jTextField;17 privateObjectInputStream objectInputStream1, objectInputStream2;18 privateObjectOutputStream objectOutputStream;19 privateFile lengthFile;20 privateFile pointFile;21 private doublelength[][];22 private Toolkit toolkit =Toolkit.getDefaultToolkit();23

24 privateTreeMap treeMap;25 privateSet set;26

27 privateLengthInfo lengthInfo;28 privateArrayList arrayList;29

30 publicCreateLength(JFrame jFrame)31 {32

33 lengthFile = new File("D://length.obj");34 pointFile = new File("D://point.obj");35 try

36 {37 objectInputStream1 = new ObjectInputStream(newFileInputStream(pointFile));38 } catch(IOException e)39 {40 new mDialog("错误", "没有景点信息!", jFrame);41 }42

43 try

44 {45 objectInputStream2 = new ObjectInputStream(newFileInputStream(lengthFile));46 treeMap =(TreeMap) objectInputStream1.readObject();47 arrayList =(ArrayList) objectInputStream2.readObject();48 } catch(IOException e)49 {50 lengthInfo = newLengthInfo();51 lengthInfo.init();52 arrayList = newArrayList();53 arrayList.add(lengthInfo);54 try

55 {56 objectOutputStream = new ObjectOutputStream(newFileOutputStream(lengthFile));57 objectOutputStream.writeObject(arrayList);58 objectOutputStream.flush();59 } catch(IOException e1)60 {61

62 }63 } catch(ClassNotFoundException e)64 {65

66 }67

68 frameInit();69

70

71 }72

73 public voidframeInit()74 {75 JFrame jFrame = newJFrame();76 jFrame.setLayout(newFlowLayout());77 jFrame.setBounds((toolkit.getScreenSize().width - 350) / 2, (toolkit.getScreenSize().height - 200) / 2, 350, 200);78

79 jTextField = new JTextField(27);80 jComboBox1 = newJComboBox();81 jComboBox1.setPreferredSize(new Dimension(270, 30));82 jComboBox2 = newJComboBox();83 jComboBox2.setPreferredSize(new Dimension(270, 30));84

85 set =treeMap.keySet();86 Iterator iterator =set.iterator();87 while(iterator.hasNext())88 {89 String string =(String) iterator.next();90 jComboBox1.addItem(string);91 jComboBox2.addItem(string);92 }93

94 int from =jComboBox1.getSelectedIndex();95 int to =jComboBox2.getSelectedIndex();96

97 lengthInfo = (LengthInfo) arrayList.get(0);98 jTextField.setText(lengthInfo.getLength(from, to) + "");99 jComboBox1.addItemListener(newItemListener()100 {101 @Override102 public voiditemStateChanged(ItemEvent e)103 {104 jTextField.setText(lengthInfo.getLength(jComboBox1.getSelectedIndex(), jComboBox2.getSelectedIndex()) + "");105 }106 });107 jComboBox2.addItemListener(newItemListener()108 {109 @Override110 public voiditemStateChanged(ItemEvent e)111 {112 jTextField.setText(lengthInfo.getLength(jComboBox1.getSelectedIndex(), jComboBox2.getSelectedIndex()) + "");113 }114 });115

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

119

120 cancelButton.addMouseListener(newMouseAdapter()121 {122 @Override123 public voidmouseClicked(MouseEvent e)124 {125 jFrame.setVisible(false);126 }127 });128 okayButton.addMouseListener(newMouseAdapter()129 {130 @Override131 public voidmouseClicked(MouseEvent e)132 {133 try

134 {135 double weight =Double.parseDouble(jTextField.getText().toString());136 lengthInfo.editLength(jComboBox1.getSelectedIndex(), jComboBox2.getSelectedIndex(), weight);137 objectOutputStream = new ObjectOutputStream(newFileOutputStream(lengthFile));138 objectOutputStream.writeObject(arrayList);139

140 new mDialog("成功", "数据修改成功!", jFrame);141 jFrame.setVisible(false);142 } catch(NumberFormatException e1)143 {144 e1.printStackTrace();145 new mDialog("错误", "请输入正确信息!", jFrame);146 } catch(IOException e1)147 {148 new mDialog("错误", "信息写入失败!", jFrame);149 }150

151

152 }153 });154

155 jFrame.add(jComboBox1);156 jFrame.add(jComboBox2);157 jFrame.add(jTextField);158 jFrame.add(cancelButton);159 jFrame.add(okayButton);160 jFrame.setVisible(true);161 jFrame.setResizable(false);162 }163

164 public static voidmain(String[] args)165 {166 new CreateLength(newJFrame());167 }168

169 }

CreateLength.java

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

4.一般用户的操作菜单

8079573f69fe501ff2c942a7c3f738cd.png

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 import javax.swing.*;2 import java.awt.*;3 importjava.awt.event.MouseAdapter;4 importjava.awt.event.MouseEvent;5

6 classNormalMenu7 {8

9 privateJFrame jFrame;10 privateJButton visitButton, searchButton, okayButton;11 private Font font = new Font("微软雅黑", 1, 20);12 private Toolkit toolkit =Toolkit.getDefaultToolkit();13

14 publicNormalMenu()15 {16 jFrame = new JFrame("功能菜单");17 jFrame.setBounds((toolkit.getScreenSize().width - 250) / 2, (toolkit.getScreenSize().height - 200) / 2, 250, 200);18 jFrame.setLayout(newFlowLayout());19 visitButton = new JButton("1.浏览景点信息");20 visitButton.setFont(font);21 searchButton = new JButton("2.查询最短路径");22 searchButton.setFont(font);23 okayButton = new JButton("关闭");24 okayButton.setFont(font);25

26

27 visitButton.addMouseListener(newMouseAdapter()28 {29 @Override30 public voidmouseClicked(MouseEvent e)31 {32 newVisitPoint();33 }34 });35

36 searchButton.addMouseListener(newMouseAdapter()37 {38 @Override39 public voidmouseClicked(MouseEvent e)40 {41 newSearchLength();42 }43 });44

45 okayButton.addMouseListener(newMouseAdapter()46 {47 @Override48 public voidmouseClicked(MouseEvent e)49 {50 jFrame.setVisible(false);51 }52 });53

54 jFrame.add(visitButton);55 jFrame.add(searchButton);56 jFrame.add(okayButton);57 jFrame.setResizable(false);58 jFrame.setVisible(true);59

60 }61

62 }

NormalMenu.java

4.1 浏览景点信息

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 import javax.swing.*;2 import java.awt.*;3 importjava.awt.event.ItemEvent;4 importjava.awt.event.ItemListener;5 importjava.awt.event.MouseAdapter;6 importjava.awt.event.MouseEvent;7 importjava.io.File;8 importjava.io.FileInputStream;9 importjava.io.IOException;10 importjava.io.ObjectInputStream;11 importjava.util.Iterator;12 importjava.util.Set;13 importjava.util.TreeMap;14 importjava.util.TreeSet;15

16 public classVisitPoint17 {18 privateJFrame jFrame;19 privateJComboBox jComboBox;20 privateJLabel jLabel;21 privateJButton okayButton;22 private Toolkit toolkit =Toolkit.getDefaultToolkit();23

24 private File file = new File("D://point.obj");25 privateObjectInputStream objectInputStream;26

27 privateTreeMap treeMap;28 privateSet set;29

30 publicVisitPoint()31 {32 try

33 {34 objectInputStream = new ObjectInputStream(newFileInputStream(file));35 jFrame = newJFrame();36 } catch(IOException e)37 {38 new mDialog("错误", "无景点信息文件!", jFrame);39 }40 frameInit();41 }42

43 public voidframeInit()44 {45 try

46 {47 jFrame.setLayout(newBorderLayout());48 jFrame.setBounds((toolkit.getScreenSize().width - 350) / 2, (toolkit.getScreenSize().height - 250) / 2, 350, 250);49

50 } catch(Exception e)51 {52 e.printStackTrace();53 }54

55 jComboBox = newJComboBox();56 jComboBox.setPreferredSize(new Dimension(270,30));57 try

58 {59 treeMap =(TreeMap) objectInputStream.readObject();60 set =treeMap.keySet();61 } catch(IOException e)62 {63

64 } catch(ClassNotFoundException e)65 {66

67 }68 Iterator iterator =set.iterator();69 while(iterator.hasNext())70 {71 jComboBox.addItem((String) iterator.next());72 }73

74 jLabel = newJLabel();75 jLabel.setPreferredSize(new Dimension(270,20));76 jLabel.setFont(new Font("宋体", 1, 20));77 jLabel.setText((String) treeMap.get(jComboBox.getSelectedItem()));78

79 jComboBox.addItemListener(newItemListener()80 {81 @Override82 public voiditemStateChanged(ItemEvent e)83 {84 jLabel.setText((String) treeMap.get(jComboBox.getSelectedItem()));85 }86 });87

88 okayButton = new JButton("确定");89 okayButton.setFont(new Font("微软雅黑", 1, 20));90 okayButton.addMouseListener(newMouseAdapter()91 {92

93 @Override94 public voidmouseClicked(MouseEvent e)95 {96 jFrame.setVisible(false);97 }98 });99 jFrame.add(jComboBox,BorderLayout.NORTH);100 jFrame.add(jLabel,BorderLayout.CENTER);101 jFrame.add(okayButton,BorderLayout.SOUTH);102 jFrame.setResizable(false);103 jFrame.setVisible(true);104 }105

106 public static voidmain(String[] args)107 {108 newVisitPoint();109 }110 }

VisitPoint.java

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

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

8f900a89c6347c561fdf2122f13be562.png

961ddebeb323a10fe0623af514929fc1.png

1 importjavax.imageio.event.IIOReadProgressListener;2 import javax.swing.*;3 import java.awt.*;4 importjava.awt.event.ItemEvent;5 importjava.awt.event.ItemListener;6 importjava.awt.event.MouseAdapter;7 importjava.awt.event.MouseEvent;8 importjava.io.File;9 importjava.io.FileInputStream;10 importjava.io.IOException;11 importjava.io.ObjectInputStream;12 importjava.util.ArrayList;13 importjava.util.Iterator;14 importjava.util.Set;15 importjava.util.TreeMap;16

17 public classSearchLength18 {19 privateJFrame jFrame;20 privateJComboBox jComboBox1, jComboBox2;21 privateJLabel jLabel;22 privateJButton jButton;23

24 privateObjectInputStream objectInputStream1, objectInputStream2;25 privateFile lengthFile, pointFile;26

27 privateTreeMap treeMap;28 privateArrayList arrayList;29 privateSet set;30

31 privateLengthInfo lengthInfo;32

33 private Toolkit toolkit =Toolkit.getDefaultToolkit();34

35 publicSearchLength()36 {37

38 jFrame = newJFrame();39 try

40 {41 lengthFile = new File("D://length.obj");42 pointFile = new File("D://point.obj");43 objectInputStream1 = new ObjectInputStream(newFileInputStream(lengthFile));44 objectInputStream2 = new ObjectInputStream(newFileInputStream(pointFile));45 arrayList =(ArrayList) objectInputStream1.readObject();46 lengthInfo = (LengthInfo) arrayList.get(0);47

48 treeMap =(TreeMap) objectInputStream2.readObject();49

50

51 } catch(IOException e)52 {53 new mDialog("错误", "无景点信息!", jFrame);54 } catch(ClassNotFoundException e)55 {56 new mDialog("错误!", "文件信息错误!", jFrame);57 }58

59

60 try

61 {62 set =treeMap.keySet();63 } catch(NullPointerException e)64 {65 new mDialog("错误", "无道路长度信息!", jFrame);66 }67

68 frameInit();69 }70

71 public voidframeInit()72 {73 jFrame.setLayout(newFlowLayout());74 jFrame.setBounds((toolkit.getScreenSize().width - 200) / 2, (toolkit.getScreenSize().height - 200) / 2, 400, 200);75

76 jComboBox1 = newJComboBox();77 jComboBox1.setPreferredSize(new Dimension(180, 30));78 jComboBox1.setFont(new Font("微软雅黑", 1, 20));79 jComboBox2 = newJComboBox();80 jComboBox2.setPreferredSize(new Dimension(180, 30));81 jComboBox2.setFont(new Font("微软雅黑", 1, 20));82

83 Iterator iterator =set.iterator();84 while(iterator.hasNext())85 {86 String string =(String) iterator.next();87 jComboBox1.addItem(string);88 jComboBox2.addItem(string);89 }90 jLabel = newJLabel();91 jLabel.setPreferredSize(new Dimension(350, 80));92 jLabel.setFont(new Font("微软雅黑", 1, 20));93 double str1 = lengthInfo.getMin(0, 1, treeMap);94 jComboBox1.addItemListener(newItemListener()95 {96 @Override97 public voiditemStateChanged(ItemEvent e)98 {99 double str1 =lengthInfo.getMin(jComboBox1.getSelectedIndex(), jComboBox2.getSelectedIndex(), treeMap);100 String str2 =lengthInfo.getStringBuilder();101 jLabel.setText("

" + "最优路径: " + str2 + "
" + "里程: " + str1 + "m" + "");102 }103 });104 jComboBox2.addItemListener(newItemListener()105 {106 @Override107 public voiditemStateChanged(ItemEvent e)108 {109 double str1 =lengthInfo.getMin(jComboBox1.getSelectedIndex(), jComboBox2.getSelectedIndex(), treeMap);110 String str2 =lengthInfo.getStringBuilder();111 jLabel.setText("" + "最优路径: " + str2 + "
" + "里程: " + str1 + "m" + "");112 }113 });114

115 jButton = new JButton("确定");116 jButton.addMouseListener(newMouseAdapter()117 {118 @Override119 public voidmouseClicked(MouseEvent e)120 {121 jFrame.setVisible(false);122 }123 });124

125 jFrame.add(jComboBox1);126 jFrame.add(jComboBox2);127 jFrame.add(jLabel);128 jFrame.add(jButton);129 jFrame.setResizable(false);130 jFrame.setVisible(true);131 }132

133

134 }

SearchLength.java

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

5c2369cd19922a4811dea0b7daa91e9c.png

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

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

但是这里我有一个疑惑:字符串中的“”是显示不出来的。一开始想使用“

5.后记

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

idea工程文件:

  • 2
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,校园导航系统是指可以帮助用户在校园内快速找到目标地点的应用程序。下面是我提供的一个简单的Java程序框架,您可以在此基础上进行开发。 首先,我们需要定义一些基本的数据结构,如校园地图、建筑物、道路等。可以使用类、接口和枚举来实现,例如: ```java // 校园地图类 public class CampusMap { private List<Building> buildings; private List<Road> roads; // ... } // 建筑物类 public class Building { private String name; private String description; private Location location; // ... } // 道路类 public class Road { private String name; private List<Location> path; // ... } // 位置类 public class Location { private double longitude; private double latitude; // ... } ``` 其次,我们需要实现一些功能,如读取地图数据、计算路径、显示地图等。可以使用各种算法和库来实现,例如: ```java // 地图读取类 public class MapReader { public static CampusMap read(String filename) { // 读取文件并解析地图数据 return new CampusMap(); } } // 路径计算类 public class PathFinder { public static List<Location> findPath(CampusMap map, Location start, Location end) { // 使用A*等算法计算最短路径 return new ArrayList<Location>(); } } // 地图显示类 public class MapViewer { public static void show(CampusMap map) { // 使用Swing等库显示地图 } } ``` 最后,我们需要将这些功能组合起来,创建一个完整的校园导航系统。可以使用命令行、GUI、Web等方式进行交互,例如: ```java // 命令行界面 public class CommandLineInterface { public static void main(String[] args) { CampusMap map = MapReader.read("map.txt"); Location start = new Location(0, 0); Location end = new Location(10, 10); List<Location> path = PathFinder.findPath(map, start, end); System.out.println(path); } } // GUI界面 public class GuiInterface { public static void main(String[] args) { CampusMap map = MapReader.read("map.txt"); MapViewer.show(map); } } // Web界面 public class WebInterface { // 使用Spring等框架实现Web服务 } ``` 以上是一个简单的Java程序框架,可以根据具体需求进行扩展和优化。希望对您有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值