用JAVA寫一個簡易的學(xué)生信息管理系統(tǒng)

前言:寫這篇文章的目的:

  • 為了以后復(fù)習(xí)方便,當(dāng)你回頭看自己的代碼的時候不至于想不起你寫下這段代碼的思路;
  • 慢慢鍛煉自己總結(jié)的能力淘这,養(yǎng)成習(xí)慣以后去寫自己的技術(shù)博客花枫,古人云,溫故而知新
  • 作為一個技術(shù)拓荒者翔冀,我希望分享我的學(xué)習(xí)心得,希望在枯燥的學(xué)習(xí)過程中找到哪怕一丁點的樂趣

效果圖如下:

簡易學(xué)生信息管理系統(tǒng)

主要功能:基本實現(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

  1. 要想對學(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;
  1. 要想對學(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類

  1. 在這個類里面你可以放入存放學(xué)生對象的集合
    至于集合容器你用哪一種呜魄,我認為在作為初學(xué)者,而且信息量很少莱衩,使用ArrayList和LinkedlList都可以爵嗅,無傷大雅,當(dāng)你后期有大的項目笨蚁,有大量的信息需要處理睹晒,那時候再去考慮吧

    • ArrayList:數(shù)組結(jié)構(gòu),查詢效率比較高括细,但刪除伪很,插入元素時效率比較低
    • LinkedList:鏈表結(jié)構(gòu),查詢效率低奋单,但刪除锉试,插入元素的效率比較高
      他們這種差異主要由于他們的的結(jié)構(gòu)所決定的
  2. 在Class類你可封裝你的增刪改查方法

    //添加學(xué)生
    public void addStudent(Student stu){
        this.stuList.add(stu);      
    }
    //刪除學(xué)生
    public void deleteStudent(Student s){
        this.stuList.remove(s);
    }

StudentFrame類

給每個按鍵添加事件
注意:每個按鍵事件被觸發(fā)時你都要去判斷3個文本框是否為空,如果是空的話需要彈出圖示框(你可以封裝一個方法檢查文本框是否為空)

學(xué)號為空提示框

姓名為空提示框
年齡為空提示框

檢查方法代碼:

// 輸入信息不能為空
    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ù)彈出提示框

重復(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)如下:

stu.txt

因為我是已二進制的形式寫進去的,所以看不懂

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é)個善緣吧!
您好踊餐,我是小焱焱_

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末景醇,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子吝岭,更是在濱河造成了極大的恐慌三痰,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,681評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件窜管,死亡現(xiàn)場離奇詭異散劫,居然都是意外死亡,警方通過查閱死者的電腦和手機幕帆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,205評論 3 399
  • 文/潘曉璐 我一進店門获搏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人失乾,你說我怎么就攤上這事常熙。” “怎么了碱茁?”我有些...
    開封第一講書人閱讀 169,421評論 0 362
  • 文/不壞的土叔 我叫張陵裸卫,是天一觀的道長。 經(jīng)常有香客問我纽竣,道長墓贿,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,114評論 1 300
  • 正文 為了忘掉前任蜓氨,我火速辦了婚禮募壕,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘语盈。我一直安慰自己舱馅,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 69,116評論 6 398
  • 文/花漫 我一把揭開白布刀荒。 她就那樣靜靜地躺著代嗤,像睡著了一般。 火紅的嫁衣襯著肌膚如雪缠借。 梳的紋絲不亂的頭發(fā)上干毅,一...
    開封第一講書人閱讀 52,713評論 1 312
  • 那天,我揣著相機與錄音泼返,去河邊找鬼硝逢。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的渠鸽。 我是一名探鬼主播叫乌,決...
    沈念sama閱讀 41,170評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼徽缚!你這毒婦竟也來了憨奸?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,116評論 0 277
  • 序言:老撾萬榮一對情侶失蹤凿试,失蹤者是張志新(化名)和其女友劉穎排宰,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體那婉,經(jīng)...
    沈念sama閱讀 46,651評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡板甘,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,714評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了详炬。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片盐类。...
    茶點故事閱讀 40,865評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖痕寓,靈堂內(nèi)的尸體忽然破棺而出傲醉,到底是詐尸還是另有隱情蝇闭,我是刑警寧澤呻率,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站呻引,受9級特大地震影響礼仗,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜逻悠,卻給世界環(huán)境...
    茶點故事閱讀 42,211評論 3 336
  • 文/蒙蒙 一元践、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧童谒,春花似錦单旁、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,699評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至琅豆,卻和暖如春愉豺,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背茫因。 一陣腳步聲響...
    開封第一講書人閱讀 33,814評論 1 274
  • 我被黑心中介騙來泰國打工蚪拦, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 49,299評論 3 379
  • 正文 我出身青樓驰贷,卻偏偏與公主長得像盛嘿,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子饱苟,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,870評論 2 361

推薦閱讀更多精彩內(nèi)容

  • 國家電網(wǎng)公司企業(yè)標(biāo)準(zhǔn)(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報批稿:20170802 前言: 排版 ...
    庭說閱讀 11,010評論 6 13
  • 面向?qū)ο笾饕槍γ嫦蜻^程孩擂。 面向過程的基本單元是函數(shù)。 什么是對象:EVERYTHING IS OBJECT(萬物...
    sinpi閱讀 1,059評論 0 4
  • 1.import static是Java 5增加的功能,就是將Import類中的靜態(tài)方法箱熬,可以作為本類的靜態(tài)方法來...
    XLsn0w閱讀 1,235評論 0 2
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法类垦,類相關(guān)的語法,內(nèi)部類的語法城须,繼承相關(guān)的語法蚤认,異常的語法,線程的語...
    子非魚_t_閱讀 31,665評論 18 399
  • 每個早晨你的身影糕伐, 是我一天最大的期盼砰琢, 你看著我的眼神, 那么深情款款款良瞧。 喜歡和你喝酒時的暢快陪汽, 聽你講那些有...
    飛鳥的魚閱讀 128評論 0 0