亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁技術(shù)文章
文章詳情頁

Java實現(xiàn)的具有GUI的校園導(dǎo)航系統(tǒng)的完整代碼

瀏覽:50日期:2022-08-13 14:57:39
0.寫在前面

2020-5-18更新

這個東西已經(jīng)是兩年前的了,現(xiàn)在問我具體細節(jié)我也不是很清楚了,而且現(xiàn)在review兩年前的代碼感覺寫的好爛。。。請大家有問題下面留言,不要加我的企鵝了,正在準(zhǔn)備考研,比較忙。

一點建議:

1.當(dāng)時會的比較少,對象實例化對于單純的數(shù)據(jù)查詢來說效率極低而且很蠢,我現(xiàn)在更建議使用數(shù)據(jù)庫,或者簡單點用xmlorjson都可以,建議想寫的好一點的同學(xué)把里面的數(shù)據(jù)讀寫邏輯改一改,用數(shù)據(jù)庫不香嗎

2.這個是分客戶端服務(wù)端的,服務(wù)端相當(dāng)于用底層手擼了一個相當(dāng)簡單的tomcat,所有的界面都是要從Client進去的。先開server再開Client,在注冊時以邀請碼判斷是否為管理員。以管理員身份進入client之后再去添加信息。

3.如果注冊時報access is denied 在Flie的路徑下加一層文件夾,如下

Java實現(xiàn)的具有GUI的校園導(dǎo)航系統(tǒng)的完整代碼

小一個月沒更新博客了,主要是臨近期末,各科的大作業(yè)都下來了,今天把自己奮斗了一個禮拜的校園導(dǎo)航系統(tǒng)貼在上面,也算滿足下自己的小成就感Java實現(xiàn)的具有GUI的校園導(dǎo)航系統(tǒng)的完整代碼(’ᴗ’ )و

實驗要求如下:

以我校為例,設(shè)計一個校園導(dǎo)航系統(tǒng),主要為來訪的客人提供信息查詢。系統(tǒng)有兩類登陸賬號,一類是游客,使用該系統(tǒng)方便校內(nèi)路線查詢;一類是管理員,可以使用該系統(tǒng)查詢校內(nèi)路線,可對校園景點路線可編輯。

說簡單點,就是給定一個地圖數(shù)據(jù),然后地圖上有好幾個點,每個點間有距離,這個程序提供了查詢兩點間最短路徑的功能。當(dāng)然,你可以為他增加很多細節(jié),比如查看景點信息啊,后臺的管理啊等等,這些都是加分項。

老師推薦使用C,其實題目也是這么要求的。但是使用C有幾個比較麻煩的問題:

第一,要是只實現(xiàn)基本的功能用C的話肯定是沒什么問題,但是要是想添枝加葉的話,C的代碼就沒法看了,寫起來麻煩讀起來也難受。

第二,地圖是有地圖數(shù)據(jù)的,要是用C的話一般人都會直接printf N多行的地圖吧,這也是一個比較麻煩的事兒。

思來想去,我決定還是用Java來做這個系統(tǒng),最短路徑用迪杰斯特拉算法。

其實我還是第一次用Java做一個功能比較多的程序,既然是第一次我就想做好點,做的與眾不同點。于是,我為這個程序增加了注冊登錄、邀請碼注冊管理員系統(tǒng)。

1.客戶端與服務(wù)端

題目中既然區(qū)分了一般用戶與管理員的權(quán)限,不如在這上面發(fā)揮一下。

import javax.swing.*; import java.awt.*; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.io.*; import java.net.Socket; public class Client { private JFrame jFrame; private JLabel accountLabel, passwdLabel, inviteLabel; private JTextField accountText, passwdText, inviteText; private Toolkit toolkit = Toolkit.getDefaultToolkit(); private JPanel accountJPanel, passwdJPanel, buttonjPanel, invitejPanel; private JButton loginButton, registButton; static JDialog jDialog=new JDialog(); private Font font = new Font('微軟雅黑', 1, 18); private BufferedWriter bufferedWriter; private BufferedReader bufferedReader; private String account, passwd; private String tips; private boolean isAdmin = false; public Client() { init(); } public void init() { jFrame = new JFrame('用戶登錄'); jFrame.setLayout(new FlowLayout()); jFrame.setBounds((toolkit.getScreenSize().width - 270) / 2, (toolkit.getScreenSize().height - 200) / 2, 270, 200);componentInit(accountJPanel = new JPanel(), accountLabel = new JLabel(), accountText = new JTextField(), ' 帳號'); componentInit(passwdJPanel = new JPanel(), passwdLabel = new JLabel(), passwdText = new JTextField(), ' 密碼');componentInit(invitejPanel = new JPanel(), inviteLabel = new JLabel(), inviteText = new JTextField(), '邀請碼'); loginButtonInit();registButtonInit(); jFrame.setVisible(true);jFrame.setResizable(false); } public void componentInit(JPanel jPanel, JLabel jLabel, JTextField jTextField, String str) { jPanel.setLayout(new FlowLayout());jLabel.setText(str);jLabel.setFont(font);jTextField.setText(''); jTextField.setColumns(14);jPanel.add(jLabel); jPanel.add(jTextField); jFrame.add(jPanel); } public void loginButtonInit() {loginButton = new JButton('登錄');loginButton.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) {try { Socket socket = new Socket('localhost', 10001); //每點擊一次必須新建一個新的Socket,否則無法一直獲取服務(wù)端的數(shù)據(jù),具體原因不明,日后考證 sendInfo(0, socket); if (tips.contains('成功')) { Home home = new Home(isAdmin); }} catch (IOException e1){ e1.printStackTrace(); } } });jFrame.add(loginButton); } public void registButtonInit() {registButton = new JButton('注冊');registButton.addMouseListener(new MouseAdapter(){ @Override public void mouseClicked(MouseEvent e) { try { Socket socket = new Socket('localhost', 10001); sendInfo(1, socket); } catch (IOException e1) { e1.printStackTrace(); } } }); jFrame.add(registButton); } public void sendInfo(int code, Socket socket)//封裝了注冊登錄的共性方法 { account = accountText.getText(); passwd = passwdText.getText(); String string; if (code == 0) { string = '登錄'; } else string = '注冊'; try { bufferedWriter = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())); //這里同樣要使用每次的新的Socket獲取寫入流 bufferedWriter.write(code + 'rn'); bufferedWriter.flush();//輸出標(biāo)示,告訴服務(wù)端是登錄還是注冊,登錄為0,注冊為1 bufferedWriter.write(account + 'rn');//必須要有結(jié)束標(biāo)示,否則服務(wù)端不會停止讀取 bufferedWriter.flush(); //刷新流 bufferedWriter.write(passwd + 'rn'); bufferedWriter.flush(); if (code == 1) //注冊的話有一個邀請碼,需要多傳輸一次 { bufferedWriter.write(inviteText.getText() + 'rn'); bufferedWriter.flush(); } bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream())); tips = bufferedReader.readLine(); if (tips.contains('管理員')) { isAdmin = true; } } catch (IOException e1) { new mDialog(string + '結(jié)果', '交換數(shù)據(jù)失敗!',jFrame); } catch (NullPointerException e1) { new mDialog(string + '結(jié)果', '服務(wù)端關(guān)閉!請先打開服務(wù)端!',jFrame); } finally { try { bufferedReader.close(); bufferedWriter.close(); } catch (IOException e1) { tips = '流關(guān)閉失敗!'; new mDialog(string + '結(jié)果', tips,jFrame); } new mDialog(string + '結(jié)果', tips,jFrame); } } public static void main(String[] args) { Client client = new Client(); } }

運用了Socket,并與Server交換數(shù)據(jù)。

詳細解釋不再說,注釋里有,也沒什么好說的,比較基礎(chǔ)的代碼。

這里有個bug沒解決(主要是沒精力也懶得改了):注冊成功后立刻點擊登錄的話會無視注冊身份,統(tǒng)一使用管理員身份,重啟客戶端之后正常。我似乎隱約知道是哪里的問題?

import com.sun.source.tree.Scope; import java.io.*; import java.net.ServerSocket; import java.net.Socket; import java.util.HashSet; import java.util.Iterator; public class Server { private Socket socket; private ServerSocket serverSocket; private String ipInfo; private BufferedReader bufferedReader; private BufferedOutputStream bufferedOutputStream; private FileOutputStream fileOutputStream; private String adminKey; private HashSet<User> hashSet; private String account, passwd, inviteCode; private File infofile = new File('D://info.key'); private boolean isAdmin = false; public Server(String adminKey) { this.adminKey = adminKey; try { serverSocket = new ServerSocket(10001); while (true)//循環(huán)接受Socket {System.out.println('服務(wù)端開啟,等待客戶端建立連接。');socket = serverSocket.accept();ipInfo = socket.getInetAddress().getHostAddress().toString(); System.out.println(ipInfo+' Connected! ');new Thread(new Task(socket)).start();//并且每次接收到Socket之后,就要新建一個線程以達到多次返回數(shù)據(jù)接受數(shù)據(jù)的目的 }} catch (IOException e){ e.printStackTrace();} } public class Task implements Runnable {private Socket socket; public Task(Socket socket) { this.socket = socket; }@Override public void run(){ try {bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));System.out.println(ipInfo); String code = bufferedReader.readLine();//客戶端先發(fā)送一個標(biāo)志,說明是登錄還是返回 if (code.equals('0')){ login(); } else regist(); code = bufferedReader.readLine();System.out.println(code); } catch (IOException e) {e.printStackTrace(); }} } public void login() {String result; String status; PrintWriter printWriter = null; if (isAdmin)//確定找到的用戶的身份 { status = '管理員'; } else status = '一般用戶';try { readFile(infofile);//先讀文件 account = bufferedReader.readLine();//客戶端傳回來的帳號密碼 passwd = bufferedReader.readLine(); User user = new User(account, passwd);//封裝對象 if (isExists(user, false))//找到了 {result = '登錄成功,身份:' + status;//傳回相關(guān)信息 } else { result = '登錄失敗,請查驗帳號密碼!'; } printWriter = new PrintWriter(socket.getOutputStream(), true); printWriter.println(result);//返回客戶端 } catch (IOException e) { e.printStackTrace(); } } public void regist() { PrintWriter printWriter = null; String status = null; try { printWriter = new PrintWriter(socket.getOutputStream(), true); account = bufferedReader.readLine();//客戶端傳回來的帳號密碼 passwd = bufferedReader.readLine(); inviteCode = bufferedReader.readLine(); User user = new User(account, passwd); readFile(infofile); if (!isExists(user, true)) { user.setAdmin(inviteCode); if (user.isAdmin()) { status = '管理員'; } else status = '一般用戶'; hashSet.add(user);//沒找到就添加進Set writeFile(infofile); printWriter.println('注冊成功!身份:' + status); } else { printWriter.println('注冊失敗,用戶已存在!'); } } catch (IOException e) { e.printStackTrace(); } } public void readFile(File file) { ObjectInputStream objectInputStream = null; PrintWriter printWriter = null; try { printWriter = new PrintWriter(socket.getOutputStream()); objectInputStream = new ObjectInputStream(new FileInputStream(file));//讀取密碼文件 hashSet = (HashSet) objectInputStream.readObject();//信息是以hashSet的形式存放在文件中 } catch (IOException e) { if (hashSet == null) { hashSet = new HashSet<>();//程序第一次運行時添加進的hashMap是null,需要新實例化一個 writeFile(infofile);//然后再寫進去 } } catch (ClassNotFoundException e) { printWriter.println('數(shù)據(jù)文件異常,請檢查文件!'); } } public void writeFile(File file) { PrintWriter printWriter = null; ObjectOutputStream objectOutputStream = null; try { objectOutputStream = new ObjectOutputStream(new FileOutputStream(file));//對象寫入流 objectOutputStream.writeObject(hashSet);//將hashSet寫入文件 printWriter = new PrintWriter(socket.getOutputStream()); } catch (IOException e) { printWriter.println('數(shù)據(jù)文件異常,請檢查文件!'); } } public boolean isExists(User user, boolean isRegister) { String account = user.getAccount(); String passwd = user.getPasswd(); Iterator iterator = hashSet.iterator(); while (iterator.hasNext()) { User stu = (User) iterator.next(); isAdmin = stu.isAdmin(); if (stu.getAccount().equals(account))//如果找到了相同用戶名 { if (isRegister)//注冊的話 { return true;//已經(jīng)找到了 } return stu.getPasswd().equals(passwd);//登陸的話還要比較密碼是否相同 } } return false;//沒找到就是假 } public void setAdminKey(String string) { adminKey = string; } public String getAdminKey() { return adminKey; } public static void main(String[] args) { Server server = new Server('KangYh is very handsome!'); } } class User implements Serializable { private String account; private String passwd; private boolean isAdmin = false; public User(String account, String passwd) { this.account = account; this.passwd = passwd; } public String getAccount() { return account; } public void setAccount(String account) { this.account = account; } public String getPasswd() { return passwd; } public void setPasswd(String passwd) { this.passwd = passwd; } public boolean isAdmin() { return isAdmin; } public void setAdmin(String string) { if (string.equals(new Server('KangYh is very handsome!').getAdminKey())) { isAdmin = true; } } @Override public int hashCode() { return account.hashCode() + passwd.hashCode() * 3; } @Override public boolean equals(Object obj) { if (!(obj instanceof User)) { return false; } User user = (User) obj; return account.equals(user.account); } }

服務(wù)端,里面有User.class。其實可以把這個class寫出來的。把User裝入HashSet<User>,保證唯一性。

這里面踩的雷就是讀寫的換行,刷新問題。寫入完畢一次必須再寫一個換行標(biāo)記,否則另一頭是沒數(shù)據(jù)的。換行標(biāo)記可以是

bufferedWriter.write(code + 'rn');bufferedWriter.newLine();

兩者中的一種。

還有一點,序列化的對象文件,官方推薦擴展名為.ser,我用的是.obj。

放張截圖:(請無視邀請碼內(nèi)容(?ロ?))

Java實現(xiàn)的具有GUI的校園導(dǎo)航系統(tǒng)的完整代碼

2.主界面

登錄成功后就是主界面了。為了省事兒,我直接截了張圖為導(dǎo)航的地圖。這個地圖是可以更換的。(動態(tài)更改我也不會啊(`Δ´)!)

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();//初始化標(biāo)題欄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('關(guān)閉'); 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('校園導(dǎo)航系統(tǒng)', SwingConstants.CENTER);title.setFont(titleFont);jFrame.add(title, BorderLayout.NORTH);//標(biāo)題文字 } 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 = '數(shù)據(jù)錯誤!'; try { checkFile(mapFile, '地圖'); } catch (IOException e) { e.printStackTrace(); new mDialog(errorTitle, '請管理員先錄入地圖數(shù)據(jù)!', jFrame); //writeMap } try { checkFile(pointFile, '景點'); } catch (IOException e) { e.printStackTrace(); new mDialog(errorTitle, '請管理員先錄入景點數(shù)據(jù)!', jFrame); //writePoint } try { checkFile(lengthFile, '距離'); } catch (IOException e) { e.printStackTrace(); new mDialog(errorTitle, '請管理員先錄入距離數(shù)據(jù)!', jFrame); //writeLength } } public void checkFile(File file, String string) throws IOException { if (!file.exists() || file.length() == 0) { throw new IOException(string + '文件打開失敗!'); } } }

這個沒啥坑,需要注意的是:

因為景點的數(shù)據(jù),距離數(shù)據(jù)都是以文件的形式保存的,所以一定會有IO異常。這時候就得提供一個比較友好的提示界面,并同時將異常信息輸出到控制臺上:

Java實現(xiàn)的具有GUI的校園導(dǎo)航系統(tǒng)的完整代碼Java實現(xiàn)的具有GUI的校園導(dǎo)航系統(tǒng)的完整代碼Java實現(xiàn)的具有GUI的校園導(dǎo)航系統(tǒng)的完整代碼

這個過程我,我美名其曰為“自檢”。聽著就高大上~(︶ω︶)~

然后就是主界面了。主界面的地圖我直接放了一個題目要求中的截圖。

確實比較簡陋,但是該有的都有了。

Java實現(xiàn)的具有GUI的校園導(dǎo)航系統(tǒng)的完整代碼Java實現(xiàn)的具有GUI的校園導(dǎo)航系統(tǒng)的完整代碼

兩個界面,一個是管理員的一個是一般用戶的。

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('關(guān)閉'); childPanel.add(cancelButton); cancelButton.addMouseListener(new MouseAdapter(){ @Override public void mouseClicked(MouseEvent e) { jFrame.setVisible(false); } });createPoint = new JButton('1.創(chuàng)建景點信息'); 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.創(chuàng)建道路信息');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('關(guān)閉'); 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實現(xiàn)的具有GUI的校園導(dǎo)航系統(tǒng)的完整代碼

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('成功', '數(shù)據(jù)正常保存', jFrame); jFrame.setVisible(false); } catch (IOException e1) { new mDialog('失敗', '數(shù)據(jù)異常!', jFrame); } } }); jFrame.add(cancelButton); jFrame.add(okayButton); jFrame.setVisible(true); } public static void main(String[] args) { new CreatePoint(); } }

Java實現(xiàn)的具有GUI的校園導(dǎo)航系統(tǒng)的完整代碼

其實可以把兩個框里的字體改一下。還有一個,每個框前面其實應(yīng)該有個提示信息的。我嫌麻煩,后來有點懶得弄了。難度也不是很大,一個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('成功', '數(shù)據(jù)成功修改', jFrame); jFrame.setVisible(false);} catch (IOException e1) { new mDialog('失敗', '數(shù)據(jù)異常!', 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實現(xiàn)的具有GUI的校園導(dǎo)航系統(tǒng)的完整代碼

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));//設(shè)置大小 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()));//設(shè)置景點的相關(guān)信息顯示 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('失敗', '數(shù)據(jù)異常!', jFrame); } catch (NullPointerException e1) { new mDialog('失敗', '已經(jīng)沒有景點信息了!', jFrame);//刪到最后就變成null了,拋異常就得處理一下 jFrame.setVisible(false); } } }); jFrame.setResizable(false); jFrame.setVisible(true); } public static void main(String[] args) { new DeletePoint(); } }

Java實現(xiàn)的具有GUI的校園導(dǎo)航系統(tǒng)的完整代碼

3.4創(chuàng)建兩點間的距離信息

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('成功', '數(shù)據(jù)修改成功!', 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實現(xiàn)的具有GUI的校園導(dǎo)航系統(tǒng)的完整代碼

這個就要說明下了,因為當(dāng)時在寫這個模塊的時候遇到了不少問題。

第一,存儲結(jié)構(gòu)。

既然是選用了迪杰斯特拉算法,那么使用鄰接矩陣就是最方便的。我一開始所希望的是一個動態(tài)的二維數(shù)組,也就是ArrayList<<ArrayList<Integer>> arraylists。但是實際上操作起來會比較麻煩。最后為了趕時間還是用的普通的二維數(shù)組int length[][],長度也就固定了。這個動態(tài)的二維數(shù)組以后再研究下。

還有就是兩個JCombobox中元素的順序問題。景點信息是隨時可以更改的,所以這個JCombobox中元素的個數(shù)與順序也是個問題。怎么能保證item與鄰接矩陣中的位置精確對應(yīng)?

我采取的做法,全局將景點的信息用TreeMap存儲,key為景點的名稱,value為景點的詳細信息。然后使用.ketSet()來將key存入set。因為TreeMap保存我存入的相對順序。要是用HashMap順序就亂了。

既然相對順序是固定的,那么我就不需要去鏈接鄰接矩陣與jcombobox了。只需要在改變景點信息的時候順便將鄰接矩陣中的數(shù)據(jù)改一下就行了。這樣就可以保證對應(yīng)關(guān)系。

第二,數(shù)據(jù)的賦值

兩點間的距離默認應(yīng)該是無限大,所以初始化的時候應(yīng)該是Integer.INT_MAX。自己和自己是沒有距離的,也就是0。這些工作都應(yīng)該在初始化的時候做好。

有兩點可以進行優(yōu)化:一是目前的版本如果第一次輸入數(shù)據(jù),編輯框會將初始化的值顯示在上面。其實這種情況還是留白比較好。二是既然自己跟自己沒有距離,那么兩個JCombobox就不應(yīng)該出現(xiàn)一樣的值。

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('成功', '數(shù)據(jù)修改成功!', 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()); } }

我承認,這個我偷懶了,這個我直接用的是上一個類。不過話說過來,這倆不是差不多嘛(´_`)

4.一般用戶的操作菜單

Java實現(xiàn)的具有GUI的校園導(dǎo)航系統(tǒng)的完整代碼

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('關(guān)閉'); 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(); } }

很簡單,想不出啥需要強調(diào)的。

4.2查詢?nèi)我鈨牲c間的最短路徑

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>' + '最優(yōu)路徑: ' + 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>' + '最優(yōu)路徑: ' + 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); } }

這里面的代碼主要就是界面。實質(zhì)的工作沒在這里面。

Java實現(xiàn)的具有GUI的校園導(dǎo)航系統(tǒng)的完整代碼

有個可以優(yōu)化的:就拿上面那個圖來說,這個路徑其實是反的,因為算法最后用的是回溯,stringBuilder.append()也就是從后往前拼接的。要是正的就更好了。

還有,在JLabel中居然可以使用html的格式控制,上面的“最優(yōu)路程”與“里程”的換行就是使用<br>實現(xiàn)的。

但是這里我有一個疑惑:字符串中的“<”“>”是顯示不出來的。一開始想使用“<--”來間隔,最后無奈只能用“---”了。

5.后記

程序不算完美,有很多我已經(jīng)意識到的bug和可以繼續(xù)優(yōu)化的點。但是好歹是自己的一次實踐,也是非常有價值的。

idea工程文件:

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

到此這篇關(guān)于Java實現(xiàn)的具有GUI的校園導(dǎo)航系統(tǒng)的完整代碼的文章就介紹到這了,更多相關(guān)Java校園導(dǎo)航系統(tǒng)內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 国产免费不卡视频 | 国产品精人成福利视频 | 第一区免费在线观看 | 日韩成人免费视频播放 | 免费黄色福利视频 | 男女毛片 | 亚洲国产日韩在线 | 在线免费观看一级毛片 | 久久中文字幕制服丝袜美腿 | 欧美日韩中文视频 | 国产一区二区精品久久凹凸 | 久热青青青在线视频精品 | 国产毛片自拍 | 免费网站看片 | 国产露脸对白刺激3p在线 | 人久热欧美在线观看量量 | 亚洲综合综合在线 | 无人区二区三区地址 | 国产h版大片在线播放 | 九九热精| 国产日韩欧美中文字幕 | 国产片一级aaa毛片视频 | 精品视频一区二区 | 草莓榴莲向日葵十八岁全微糖 | 国产色中色| 久久这里只有精品23 | 欧美自拍色图 | 大陆精品自在线拍国语 | 女黄色片 | 又黄又爽又猛大片录像 | 国产精品午夜性视频网站 | 一级网 | 免费看一级欧美毛片视频 | 午夜性视频播放免费视频 | 国产亚洲精品久久 | 搞黄在线观看 | 久久视频精品53在线观看 | 黄色片欧美 | 欧美一级第一免费高清 | 日韩大片免费在线观看 | 国产福利不卡视频在免费 |