前言:寫這篇文章的目的:
- 為了以后復(fù)習(xí)方便,當(dāng)你回頭看自己的代碼的時候不至于想不起你寫下這段代碼的思路;
- 慢慢鍛煉自己總結(jié)的能力淘这,養(yǎng)成習(xí)慣以后去寫自己的技術(shù)博客花枫,古人云,溫故而知新
- 作為一個技術(shù)拓荒者翔冀,我希望分享我的學(xué)習(xí)心得,希望在枯燥的學(xué)習(xí)過程中找到哪怕一丁點的樂趣
效果圖如下:
主要功能:基本實現(xiàn)增刪改查,跳轉(zhuǎn)最后一個蚁署,跳轉(zhuǎn)第一個,上一個蚂四,下一個(其中可能存在一點小bug光戈,這個小程序也僅僅用于練習(xí)哪痰,將剛掌握的知識融合在一起)
工具:配置好java運行環(huán)境,且裝好eclipse的PC機一臺
運用的主要知識點:面對對象久妆,IO晌杰,集合,AWT筷弦,Swing.......
我是快樂的分割線1號
關(guān)于界面:
友情提示:在界面上不用花過多的精力和時間肋演,稍微復(fù)雜點的界面可以用插件拖拽自動生成,很方便烂琴,你可以把省出來的精力和時間用在代碼邏輯上爹殊。
網(wǎng)上關(guān)于界面生成的插件很多,個人建議使用WindowBuilder,當(dāng)然你也可以用其他的你認為順手的插件奸绷;
WindowBuilder是一款非常流行的Java圖形化界面開發(fā)插件
WindowBuilder下載網(wǎng)站
至于界面的安裝可以參照百度經(jīng)驗
Eclipse中JavaSwing圖形插件安裝
注意:我是為了測試方便才在界面中加了一個文本域JTextArea textArea梗夸,如果你用的是Swing編程,textArea本身是不帶滾動條的号醉,而最好的解決辦法是在textArea外加一個JScrollPane scrollPane面板反症,這樣你就可以輕松擁有上下滾動條和左右滾動條,當(dāng)然你完全可以不用將學(xué)生信息顯示出來畔派,也就是說根本不需要textArea
沒有文本域的界面
我是快樂的分割線2號
功能及代碼:
別以為這個程序很小惰帽,但其中需要注意的細節(jié)還是很多的
學(xué)生類Student
- 要想對學(xué)生進行IO操作,則必須實現(xiàn) Serializable接口父虑,打上可序列化標(biāo)志
public class Student implements Serializable {
//學(xué)生可以被進行IO操作该酗,則必須實現(xiàn) Serializable接口,打上可序列化標(biāo)志
private String no;
private String name;
private String age;
- 要想對學(xué)生進行增刪改查操作士嚎,必須重寫Student類中equals方法
public boolean equals(Object obj) {
Student s=(Student)obj;
return this.no==s.getNo()&&this.name==s.getName()&&this.age==s.getAge();
}
Class類
-
在這個類里面你可以放入存放學(xué)生對象的集合
至于集合容器你用哪一種呜魄,我認為在作為初學(xué)者,而且信息量很少莱衩,使用ArrayList和LinkedlList都可以爵嗅,無傷大雅,當(dāng)你后期有大的項目笨蚁,有大量的信息需要處理睹晒,那時候再去考慮吧- ArrayList:數(shù)組結(jié)構(gòu),查詢效率比較高括细,但刪除伪很,插入元素時效率比較低
- LinkedList:鏈表結(jié)構(gòu),查詢效率低奋单,但刪除锉试,插入元素的效率比較高
他們這種差異主要由于他們的的結(jié)構(gòu)所決定的
在Class類你可封裝你的增刪改查方法
//添加學(xué)生
public void addStudent(Student stu){
this.stuList.add(stu);
}
//刪除學(xué)生
public void deleteStudent(Student s){
this.stuList.remove(s);
}
StudentFrame類
給每個按鍵添加事件
注意:每個按鍵事件被觸發(fā)時你都要去判斷3個文本框是否為空,如果是空的話需要彈出圖示框(你可以封裝一個方法檢查文本框是否為空)
檢查方法代碼:
// 輸入信息不能為空
public boolean check() {
if (txtNo.getText().equals("")) {
dialog.showMessageDialog(null, "學(xué)號不能為空览濒!");
return false;
}
if (txtName.getText().equals("")) {
dialog.showMessageDialog(null, "名字不能為空呆盖!");
return false;
}
if (txtAge.getText().equals("")) {
dialog.showMessageDialog(null, "年齡不能為空拖云!");
return false;
}
return true;
}
1. 給-“添加”按鍵-添加事件
需要注意的是,每次添加按鍵事件被觸動后要判斷庫中是否有次學(xué)生应又,也就是說不能重復(fù)添加宙项,如果重復(fù)彈出提示框
// 添加學(xué)生
public void addStu() {
btnAdd.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
if (check() == true) {
//遍歷根據(jù)學(xué)號找重復(fù)
for (Student s : c.stuList) {
if (s.getNo().equals(txtNo.getText())) {
dialog.showMessageDialog(null, "不能重復(fù)添加!");
return;
}
}
try {
c.addStudent(new Student(txtNo.getText(), txtName.getText(), txtAge.getText()));
saveStudent();
} catch (Exception e1) {
e1.printStackTrace();
}
dialog.showMessageDialog(null, "添加成功");
}
}
});
}
PS:考慮到貼上代碼文章太長株扛,再說也沒必要尤筐,后面的稍長的代碼我就略過,阿彌陀佛席里,么么噠
2. 給-“刪除”-刪除按鍵添加事件
注意:
1.刪除后則顯示下一個學(xué)生的信息,如果刪除的是最后一個學(xué)生拢驾,則顯示第一個學(xué)生的信息
2.可以通過學(xué)生學(xué)號查找到學(xué)生對象奖磁,根據(jù)集合下標(biāo)刪除,亦可以直接查找這個學(xué)生對象刪除學(xué)生信息(利用集合中contains(Object o)方法繁疤,如果此列表中包含指定的元素咖为,則返回true)
//如果是刪除的是最后一個學(xué)生,則顯示第一個學(xué)生
if (c.stuList.get(c.stuList.size() - 1).getNo().equals(txtNo.getText())) {
txtNo.setText(c.stuList.get(0).getNo()); txtName.setText(c.stuList.get(0).getName());
txtAge.setText(c.stuList.get(0).getAge());
} else {
txtNo.setText(c.stuList.get(a).getNo());
txtName.setText(c.stuList.get(a).getName());
txtAge.setText(c.stuList.get(a).getAge());
}
3. 給-“修改按鈕”-添加事件
根據(jù)學(xué)號來修改學(xué)生信息稠腊,修改失敗彈出提示框
4. 給-“查找”-按鈕添加事件
注意:根據(jù)學(xué)號來查找學(xué)生信息躁染,遍歷整個集合,但問題是如何才能判斷迭代到了最后一個學(xué)生架忌?這個問題我思慮良久吞彤,最終找到一個蹩腳的辦法,定義一個整型變量temp叹放,沒遍歷一次集合就加1饰恕,如果temp==集合的大小,則遍歷到了最后一個學(xué)生對象井仰,如果找不到學(xué)生信息埋嵌,則彈出提示框:
5. 給剩余的其他按鈕添加事件
根據(jù)上面的步驟一步一步去操作,耐心的仔細的去考慮俱恶,相信難不倒聰明的你雹嗦!
我是快樂的分割線3號
1. 保存學(xué)生對象
// 保存學(xué)生對象
public void saveStudent() {
FileOutputStream out;
ObjectOutputStream writer = null;
try {
out = new FileOutputStream("F:\\IO\\stu.txt");
writer = new ObjectOutputStream(out);
writer.writeObject(c);// 寫入學(xué)生對象
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
打開你存儲學(xué)生信息的文件你會發(fā)現(xiàn)如下:
因為我是已二進制的形式寫進去的,所以看不懂
2. // 讀出學(xué)生對象信息
public void readStudent() {
File file = new File("F:\\IO\\stu.txt");
if (file.exists()) {
FileInputStream in = null;
ObjectInputStream reader = null;
try {
in = new FileInputStream(file);
reader = new ObjectInputStream(in);
c = (Class) reader.readObject();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
} else {
try {
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
saveStudent();
}
我是最后的分割線
需要改進的地方:
- 可能還存在小bug沒有解決
- 學(xué)生信息不完整合是,可以添加院校了罪,專業(yè),班級等等來擴展
- 學(xué)生對象完全可以存入到數(shù)據(jù)庫中聪全,利用JDBC來操作學(xué)生對象
- 缺少一個登陸界面捶惜,以管理的身份驗證密碼后進入管理系統(tǒng),管理學(xué)生信息
明白事理的人使自己適應(yīng)這個世界荔烧;不明白事理的人想讓這個世界適應(yīng)自己吱七。---蕭伯納
施主汽久,結(jié)個善緣吧!
您好踊餐,我是小焱焱_