Java实现的具有GUI的校园导航系统的完整代码
作者:康先森 发布时间:2022-06-28 03:43:56
0.写在前面
2020-5-18更新
这个东西已经是两年前的了,现在问我具体细节我也不是很清楚了,而且现在review两年前的代码感觉写的好烂。。。请大家有问题下面留言,不要加我的企鹅了,正在准备考研,比较忙。
一点建议:
1.当时会的比较少,对象实例化对于单纯的数据查询来说效率极低而且很蠢,我现在更建议使用数据库,或者简单点用xmlorjson都可以,建议想写的好一点的同学把里面的数据读写逻辑改一改,用数据库不香吗
2.这个是分客户端服务端的,服务端相当于用底层手撸了一个相当简单的tomcat,所有的界面都是要从Client进去的。先开server再开Client,在注册时以邀请码判断是否为管理员。以管理员身份进入client之后再去添加信息。
3.如果注册时报access is denied 在Flie的路径下加一层文件夹,如下
小一个月没更新博客了,主要是临近期末,各科的大作业都下来了,今天把自己奋斗了一个礼拜的校园导航系统贴在上面,也算满足下自己的小成就感
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异常。这时候就得提供一个比较友好的提示界面,并同时将异常信息输出到控制台上:
这个过程我,我美名其曰为“自检”。听着就高大上~(︶ω︶)~
然后就是主界面了。主界面的地图我直接放了一个题目要求中的截图。
确实比较简陋,但是该有的都有了。
两个界面,一个是管理员的一个是一般用户的。
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个功能。
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();
}
}
其实可以把两个框里的字体改一下。还有一个,每个框前面其实应该有个提示信息的。我嫌麻烦,后来有点懒得弄了。难度也不是很大,一个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();
}
}
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();
}
}
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());
}
}
这个就要说明下了,因为当时在写这个模块的时候遇到了不少问题。
第一,存储结构。
既然是选用了迪杰斯特拉算法,那么使用邻接矩阵就是最方便的。我一开始所希望的是一个动态的二维数组,也就是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());
}
}
我承认,这个我偷懒了,这个我直接用的是上一个类。不过话说过来,这俩不是差不多嘛(´_`)
4.一般用户的操作菜单
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);
}
}
这里面的代码主要就是界面。实质的工作没在这里面。
有个可以优化的:就拿上面那个图来说,这个路径其实是反的,因为算法最后用的是回溯,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
猜你喜欢
- /*冒泡排序:双层循环1.外层循环:控制排序轮数,排序数组长度减1(最后一次循环只剩下一个元素,不需要比较,同时数组已完成排序。2.内层循环
- 前言本篇文章 中写到的是 flutter 调用了Android 原生的 TextView 案例添加原生组件的流程基本上可以描述为:1 and
- 使用linq把多列的List转化为只有指定列的List1、方式一2、方式二
- 在 Windows 有一些字符是不能作为文件名,尝试重命名一个文件,输入/ 就可以看到windows 提示的不能作为文件名的字符那么具体是包
- 本文实例为大家分享了java实现双色球抽奖的具体代码,供大家参考,具体内容如下实现双色球先考虑整体思路:1.随机生成7位数的数组为大奖号码(
- 目录1 简介2 Condition的实现分析等待队列等待(await):AbstractQueuedLongSynchronizer中实现C
- 过滤器模式(Filter Pattern)或标准模式(Criteria Pattern)是一种设计模式,这种模式允许开发人员使用不同的标准来
- 本文实例讲述了Java对XML文件增删改查操作。分享给大家供大家参考,具体如下:xml文件:<?xml version="1
- 程序分析: 兔子的规律为数列1,1,2,3,5,8,13,21....程序设计:public class exp2{ publi
- 这是Hadoop学习全程记录第1篇,在这篇里我将介绍一下如何在Linux下安装Hadoop1.x。先说明一下我的开发环境:虚拟机:VMwar
- 一、背景目前的Springboot,当发生了任何修改之后,必须关闭后再启动Application类才能够生效,显得略微麻烦。Springbo
- foreach嵌套使用if标签对象取值问题最近做项目过程中,涉及到需要在 Mybatis 中 使用 foreach 进行循环读取传入的查询条
- 目录一、背景二、推荐方式2.1 自定义的枚举2.2 外部枚举三、总结一、背景平时工作开发过程中,难免会用到状态机(状态的流转)。如奖学金审批
- Spring是一个非常流行的Java Web开发框架,它提供了强大的依赖注入、面向切面编程、声明式事务管理等功能,为开发者提供了高效、快速地
- 自定义 webflux 容器配置配置代码@Componentpublic class ContainerConfig extends Rea
- 1.设计思路,使用VersionCode定义为版本升级参数。android为我们定义版本提供了2个属性:<manifest packa
- 本文实例为大家分享了Springboot整合pagehelper分页展示的具体代码,供大家参考,具体内容如下一、添加依赖查找maven中pa
- Java中Stop-The-World机制简称STW,是在执行垃圾收集算法时,Java应用程序的其他所有线程都被挂起(除了垃圾收集帮助器之外
- @Cacheable自定义KeyGenerator1. 概述SpringBoot 使用 @Cacheable 可以方便的管理缓存数据,在不指
- Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方法和属性;这种动