第一篇:Java課程設計報告
課 程 設 計
課程名稱 Java語言課程設計 題目名稱 人事管理系統的設計與實現 學生學院 應用數學學院 專業班級 學 號 學生姓名 指導教師 劉科峰
2014 年 10 月 29
日 一.設計內容
自學Swing圖形界面設計和數據庫程序設計。開發用于某單位的人事管理系統。該系統要求實現以下功能:
1.員工信息管理包括:員工信息一覽表、新員工的建立、修改 2.薪資福利管理:考勤與薪資的連動計算、薪資與福利的設置
3.考勤假期管理:考勤項目錄入, 實現考勤信息的查詢、統計、匯總 4.人事報表管理:按照員工性別,數目,薪酬自動生成相關報表, 可自定義統計分析條件并可對歷史報表進行管理。
設計亮點
1.null布局方式
Swing圖形界面設計中有很多布局方式,通過本次學習了解到了FlowLayout,BorderLayout,GridLayout以及null布局,就這四種布局方式而言,null布局的優點在于可以將組建的位置精準到坐標值,可以把組件放到任意想放置的位置,另外可以通過null去設置組件的大小,相較于其他布局方式來說是一個很大的優勢。但同時它的缺點在于不能根據Frame的大小變化而改變位置。
2.組件部分屬性的設計
Swing中有很多方法是用來實現組件屬性設置的,比如button.setVisible(false);按鈕通過調用這個方法實現不可見,這是我此次課程設計中的一個亮點,因為組件是沒有設置大小的方法的,只有依靠于相應的布局方式才能改變它的大小,通過設置多幾個按鈕設為不可見,將所要可見按鈕實現大小以及位置的控制是一種很好的方法。
二、設計方案
1主界面(只列出界面設計方面的代碼)
JPanel panel=new JPanel();JTable table=null;JButton ibtn=new JButton(“員工信息”);JButton cbtn=new JButton(“考勤管理”);JButton mbtn=new JButton(“薪資管理”);JButton tbtn=new JButton(“人事報表”);ImageIcon rtou = new ImageIcon(“rentou.jpg”);
JLabel imgLabel=new JLabel(rtou);
//上面代碼定義了一個面板與四個標簽,并引入了一個圖片
panel.setLayout(new FlowLayout());//設置面板為流布局
panel.add(ibtn);panel.add(cbtn);panel.add(mbtn);panel.add(tbtn);panel.setBackground(Color.GRAY);
//將按鈕加到面板中,設置面板為灰色
this.add(imgLabel,BorderLayout.CENTER);this.add(panel,BorderLayout.SOUTH);this.setBounds(300, 180, 600, 350);this.setVisible(true);this.getContentPane().setBackground(Color.GRAY);this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);/*圖片標簽以邊框布局放置在中間,將面板也以邊框布局放置在下面,可見,灰色,點擊關閉程序*/
(2)查詢員工界面(只列出界面設計方面的代碼)
Label idlabel = new JLabel(“ID”);JLabel namelabel = new JLabel(“姓名”);JLabel bumenlabel = new JLabel(“部門”);JLabel zhiweilabel = new JLabel(“職位”);
JTextField idfiled = new JTextField(8);JTextField namefield = new JTextField(8);JComboBox bumenbox =new JComboBox();JComboBox zhiweubox = new JComboBox();
JButton btn=new JButton(“查詢”);JButton ibtn=new JButton(“添加”)
JPanel spanel=new JPanel();JPanel vpanel=new JPanel();
/*定義和各個組件,4個標簽,兩個文本框,兩個復選框,兩個按鈕,兩個面板容器*/ spanel.setLayout(new FlowLayout());
vpanel.setLayout(new FlowLayout(FlowLayout.CENTER,45,25));
bumenbox.addItem(“");
bumenbox.addItem(”管理部“);
bumenbox.addItem(”生產部“);
bumenbox.addItem(”業務部“);
zhiweubox.addItem(”“);
zhiweubox.addItem(”部長“);
zhiweubox.addItem(”副部長“);
zhiweubox.addItem(”普工“);
spanel.add(idlabel);
spanel.add(idfiled);
spanel.add(namelabel);
spanel.add(namefield);
spanel.add(bumenlabel);
spanel.add(bumenbox);
spanel.add(zhiweilabel);
spanel.add(zhiweubox);
spanel.add(btn);
vpanel.add(ibtn);
spanel.setBackground(Color.GRAY);
vpanel.setBackground(Color.GRAY);
//將各個組件放進對應面板,設置相關屬性
this.add(spanel,BorderLayout.NORTH);
this.add(vpanel,BorderLayout.SOUTH);
this.setBounds(300, 180, 600, 350);
this.setVisible(true);
this.getContentPane().setBackground(Color.GRAY);
//將面板以邊框布局放入框架中,設置屬性(3)增加員工信息界面
JPanel panel=new JPanel();
JLabel timeLabel=new JLabel(”時間“);JLabel allnumLabel=new JLabel(”員工總數“);
JLabel staffMoLabel=new JLabel(”考勤“);JLabel entryLabel=new JLabel(”全勤“);
JLabel quitLabel=new JLabel(”缺勤“);JLabel mwLabel=new JLabel(”性別比例“);
JLabel manLabel=new JLabel(”男“);
JLabel womanLabel=new JLabel(”女“);JLabel proportionLabel=new JLabel(”男女比例“);JLabel distributionLabel=new JLabel(”人員部門分布“);JLabel mdpLabel=new JLabel(”管理部“);
JLabel pdpLabel=new JLabel(”生產部“);JLabel bdpLabel=new JLabel(”業務部“);JLabel xmLabel=new JLabel(”項目“);JLabel xzLabel=new JLabel(”細則“);JLabel stLabel=new JLabel(”數據統計“);
JTextField timeFiled = new JTextField(8);
JTextField allnumFiled = new JTextField(8);JTextField entryFiled = new JTextField(8);JTextField quitFiled = new JTextField(8);JTextField manFiled = new JTextField(8);JTextField womanFiled = new JTextField(8);JTextField proportionFiled = new JTextField(8);JTextField mdpFiled = new JTextField(8);JTextField pdpFiled = new JTextField(8);JTextField bdpFiled = new JTextField(8);// 定義所需組件
public Selectrenshi(String tablename){
super(”人事管理“);
panel.setLayout(null);
panel.setBackground(Color.GRAY);
panel.add(xmLabel);
panel.add(xzLabel);
panel.add(stLabel);
panel.add(timeLabel);
panel.add(timeFiled);
panel.add(allnumLabel);
panel.add(allnumFiled);
panel.add(staffMoLabel);
panel.add(entryLabel);
panel.add(entryFiled);
panel.add(quitLabel);
panel.add(quitFiled);
panel.add(mwLabel);
panel.add(manLabel);
panel.add(manFiled);
panel.add(womanLabel);
panel.add(womanFiled);
panel.add(proportionLabel);
panel.add(proportionFiled);
panel.add(distributionLabel);
panel.add(mdpLabel);
panel.add(mdpFiled);
panel.add(pdpLabel);
panel.add(pdpFiled);
panel.add(bdpLabel);
panel.add(bdpFiled);
//將組件加到相應面板中
xmLabel.setBounds(120,20,100,30);
xzLabel.setBounds(240,20,100,30);
stLabel.setBounds(360,20,100,30);
timeLabel.setBounds(120,50,100,30);
timeFiled.setBounds(360,50,100,30);
allnumLabel.setBounds(120,100,100,30);
allnumFiled.setBounds(360,100,100,30);
staffMoLabel.setBounds(120,150,100,30);
entryLabel.setBounds(240,150,100,30);
entryFiled.setBounds(360,150,100,30);
quitLabel.setBounds(240,200,100,30);
quitFiled.setBounds(360,200,100,30);
mwLabel.setBounds(120,250,100,30);
manLabel.setBounds(240,250,100,30);
manFiled.setBounds(360,250,100,30);
womanLabel.setBounds(240,300,100,30);
womanFiled.setBounds(360,300,100,30);
proportionLabel.setBounds(240,350,100,30);
proportionFiled.setBounds(360,350,100,30);
distributionLabel.setBounds(120,400,100,30);
mdpLabel.setBounds(240,400,100,30);
mdpFiled.setBounds(360,400,100,30);
pdpLabel.setBounds(240,450,100,30);
pdpFiled.setBounds(360,450,100,30);
bdpLabel.setBounds(240,500,100,30);
bdpFiled.setBounds(360,500,100,30);
//采用null布局,設置組建坐標值
this.add(panel,BorderLayout.CENTER);
this.setBounds(300, 100, 600, 600);
this.setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.getContentPane().setBackground(Color.GRAY);
//將面板放入框架,設置相應屬性(4)員工考勤界面
JLabel idlabel = new JLabel(”ID“);JComboBox idbox =new JComboBox();CheckTable model = null;
JButton wbtn=new JButton(”修改“);
JButton cbtn=new JButton(”查詢“);JButton mbtn=new JButton(”創建薪資表“);JButton rbtn=new JButton(”創建人事表“);
JScrollPane scrollpane = null;JPanel spanel=new JPanel();JPanel vpanel=new JPanel();JTable table=null;spanel.add(idbox);panel.add(wbtn);spanel.add(cbtn);vpanel.add(mbtn);vpanel.add(rbtn);spanel.setBackground(Color.GRAY);vpanel.setBackground(Color.GRAY);this.add(spanel,BorderLayout.NORTH);this.add(vpanel,BorderLayout.SOUTH);this.setBounds(300, 180, 600, 350);this.setVisible(true);this.getContentPane().setBackground(Color.GRAY);
(5)選擇考勤表界面
JLabel checklabel = new JLabel(”選擇考勤表“);JLabel newlabel = new JLabel(”創建考勤表“);JComboBox timebox =new JComboBox();JTextField newfield = new JTextField();JButton btn=new JButton(”確認“);JButton nbtn=new JButton(”創建");JPanel spanel=new JPanel();spanel.add(checklabel);
spanel.add(timebox);
spanel.add(btn);
spanel.add(newlabel);
spanel.add(newfield);
spanel.add(nbtn);
checklabel.setBounds(30,90,100,30);
timebox.setBounds(180,90,100,30);
btn.setBounds(360,90,100,30);
newlabel.setBounds(30,200,100,30);
newfield.setBounds(180,200,100,30);
nbtn.setBounds(360,200,100,30);
this.add(spanel);
this.setBounds(300, 180, 600, 350);
this.setVisible(true);
三、結果和數據處理
四、結論
1.Swing圖形界面
圖形用戶界面(GUI)是程序不可或缺的一部分,它便于用戶和程序的交互。在Swing界面中是以Frame為框架,采用合理的布局方式(FlowLayout,BorderLayout,GridLayout,null),將Panel加入框架之中,而實現界面的各個組件將調用各種方法設置自身屬性實行可視化界面以及加入到面板之中。再通過事件監聽器實現事件的監聽預處理機制。
2.數據庫
在這次課程設計中哦我主要負責Swing圖像界面,對于數據庫只做了最簡單的了解。程序中采用了最流行的關系型數據庫mysql,雪化了mysql的建立,刪除,與修改以及使用sql語言對數據庫進行一些簡單的操作,將按鈕等設置的監聽事件與數據庫相連接。
五、問題與討論
1.組件的方法調用
在這次課程設計中,用到了很多的組件,例如Button,Jlabel,TextField,ComBox,等。Swing圖形界面也確實提供了很多方法去設置相關組件的屬性,例如label.setVisible(false);設置標簽不可見等很多方法,只要查看API文檔幾乎就能實現很多功能,但是對于按鈕等最常見的組件來說設置大小如果不依靠相關布局方式很難設置,我在程序中之所以運用了很多的bull布局方式就是為了實現組件大小的設置,如果說能有一個方法直接設置組件大小而不受其他組件或容器影響就能使代碼很簡潔了。2.相對布局
在編寫圖像界面的程序的時候,我用了很多的布局方式,有FlowLayout,BorderLayout,GrirLayout,null等,其中null布局用的最多。null布局的優點在于可以將組建的位置精準到坐標值,可以把組件放到任意想放置的位置,另外可以通過null去設置組件的大小,相較于其他布局方式來說是一個很大的優勢。但同時它的缺點在于不能根據Frame的大小變化而改變位置。其他三種布局方式雖然實現了歲Frame大小變動而改變組件大小及位置但是不容易控制,如果null布局能實現相對布局就是很好的一種布局方式了。
第二篇:java課程設計報告
《Java語言程序設計》
題 目:指導老師:姓 名:專 業:班 級:日 期:課程設計報告
目 錄
一、系統總體設計.......................................1
(一)設計目標及完成功能..............................1
(二)系統結構設計...................................1
二、數據庫設計........................................1
三、詳細設計..........................................1(一)界面設計........................................1(二)系統設計........................................2(三)關鍵技術及算法..................................2
四、測試..............................................2
五、安裝使用說明.......................................2 總結(體會)..........................................2 參考文獻:............................................2
《Java語言程序設計》課程設計報告
一、系統總體設計
(一)設計目標及完成功能
此部分可以包括如下內容:
1.窗口功能說明:設計了幾個窗口,分別實現什么功能.2.菜單欄或工具欄說明:如果設計了菜單或工具欄,分別說明包括哪些項及其各自實現什么操作.……
(二)系統結構設計
說明:要繪出系統結構圖
二、數據庫設計
必須包含以下內容:E-R圖(說明所有實體及其屬性)、表結構列表(字段名、類型、主鍵、備注等)。
沒有用到數據庫的不用寫此部分
三、詳細設計
(一)界面設計
界面抓圖,圖要有編號和標題(格式:圖1 主界面圖),位于圖的下方居中對齊。
《Java語言程序設計》課程設計報告
(二)系統設計
1.共設計了幾個類或接口,是否有繼承關系,各實現什么功能,繪圖(列表)說明。
2.列表說明各類的方法及其功能。
(三)關鍵技術及算法
使用的主要算法分析、關鍵技術說明。如數據庫連接技術、加密解密算法等。
四、測試
五、安裝使用說明
1.系統配置說明。是否需要配置數據源或安裝補丁包、導入數據庫等。
2.登錄的用戶名、密碼。3.其他特殊說明。
總結(體會)
(談談本次課程設計的心得體會)
參考文獻:
[1] 竇萬峰.軟件工程方法與實踐[M].機械工業出版社,2009 [2] 李兆鋒,張得生.Java Web項目開發案例精粹[M].電子工業出版社,2010 [3] 沈澤剛,秦玉平.Java Web編程技術[M].清華大學出版社,2009
《Java語言程序設計》課程設計報告
包括書籍、網站、論壇等。
說明:(以下內容作為要求)
正文部分一律用小四號字,宋體,1.5倍行距。一級大標題黑體四號字靠左,加粗。二級大標題黑體四號靠左,不加粗。
參考文獻:
(要求:五號字,宋體,左對齊,懸掛縮進,單倍行距。按作者、書名、出版社、出版時間格式逐一列出)
第三篇:Java課程設計報告
《Java課程實習》報告
題目 學號 學生姓名
音樂播放器
201011621335 201011621329 200811621320
朱劍峰 薛文博 劉彬
聯系方式 *** *** *** 所在專業 所在班級 指導教師 成績 教師簽字
計算機科學與技術
1103 劉思鳳
課程設計時間:2013年6月1日 至 2013年6月25日 評語:
廣東海洋大學本科生課程設計報告
目 錄
摘要......................................................................................................................................2 1 緒論..............................................................................................................................3 1.1 1.2 1.3 1.4 2 2.1 2.2 3 3.1 3.2 課題背景..............................................................................................................3 課程設計目的......................................................................................................3 課程設計實驗環境..............................................................................................3 課程設計要求......................................................................................................4 程序界面布局設計..............................................................................................4 功能分析..............................................................................................................4 系統功能結構圖..................................................................................................5 模塊功能設計......................................................................................................5 課程系統分析..............................................................................................................4
系統設計與實現..........................................................................................................5
3.2.1 “菜單欄”功能設計......................................................................................5 3.2.2 “動態音頻播放進度顯示”功能設計..........................................................9 3.2.3 “歌曲搜索”功能實現..................................................................................9 3.2.4 “歌曲播放/停止”功能實現......................................................................10 3.2.5 “列表展示”功能實現................................................................................11 4 系統優點與缺點........................................................................................................13 4.1 4.2 5 系統優點...............................................................................................................13 系統缺點...............................................................................................................13
系統開發過程............................................................................................................14 Myeclipse平臺開發版本...............................................................................................14 NetBeans開發平臺版本................................................................................................15 設計總結....................................................................................................................16
參考文獻.............................................................................................................................17 附
錄.................................................................................................................................18 關鍵代碼..........................................................................................................................18
1、音樂解碼函數(decodeMusic)........................................................................18
2、播放線程類(class PlayThread).....................................................................20
3、控制滾動條類(class RunSlider)...................................................................21
廣東海洋大學本科生課程設計報告
摘要
JAVA是目前最流行的軟件開發語言之一,稱為網絡上的“世界語”。JAVA適合開發基于多媒體、與平臺無關、用面向對象的方法進行的基于Internet、Intranet、Extranet的Applet和應用程序。它具有簡單高效、面向對象、不依賴于機器結構的特點,支持多線程、分布和并發機制。用JAVA開發的應用軟件在可移植性、健壯性、安全性等方面大大優于已存在的其他編程語言。
JAVA是一門包含多種知識的學科,提供了豐富的類庫,能最大限度地利用網絡。JAVA可廣泛用于面向對象的事件描述、處理面向對象的企業型的應用開發,還應用于Internet系統管理、Web頁面設計、Internet可視化軟件開發等方面。在學習的過程中我學到了許多以前沒有學到的概念和新鮮資訊。運用這些知識可以完成老師交給我的課程設計任務。這次老師讓我們自己擬訂題目,給了我們很大的想象空間。我們自選了一個音樂播放器的課程設計題目。
本小組之所以選擇做音樂播放器,全賴于本小組成員均對音樂有濃厚的興趣,雖熱衷于聽音樂,但現在網上流傳的音樂播放器還不能滿足我們這些發燒友,像高清音樂等,這些高品質的作品若在現流行的播放器上運行,這只能做普通音樂文件“享用”。話說如此,因本小組開發能力有限,課程比較多,時間所限,以至暫且把音樂播放器開發到version0.9。主要功能還未能達到我們想要的境界。
小結一下,本小組的播放器所具備的功能有如下,添加音樂,刪除音樂,搜索音樂,更換播放器皮膚,更改播放模式等。(詳見2.2節)
本次設計的播放器在具備基本功能的基礎上,還具有很強的擴展性,如歌詞導入,可播放音樂類型的增加等等這些還未實現的地方我們都提供了許多接口,以便日后做修改或增加功能所用。
能夠具備一個屬于自己的播放器確實是一件非常高興的事情,能夠一邊開發一邊享受音樂的熏陶更是一件難得可貴的經歷,愿此摘要能讓讀者感受得到筆者的興奮與成功。
廣東海洋大學本科生課程設計報告
音樂播放器
任務分工
系統設計與代碼實現:朱劍峰 系統測試與維護:薛文博 需求與功能分析:劉彬 指導教師:劉思鳳 緒論
1.1 課題背景
隨著社會電子音樂文件的與日俱增,作為現在最流行的音樂文件*.mp3,*.wav文件的數量和規模也在比以往的任何時候要多,不論是電臺DJ需要使用方便而有效地管理自己所使用的音樂文件,還是個人。在計算機日益普及的今天,若采用一套有效的音樂播放器。將自己所收藏的大量的音樂文件能隨時隨地的播放,這將方便于眾用戶聽音樂的需求。通過使用本音樂播放器能為音樂愛好者帶來意想不到的收獲。
1.2 課程設計目的
《應用軟件開發實習》是計算機相關專業的必修專業基礎課程,其實踐性、應用性很強。實踐教學環節是必不可少的一個重要環節。本課程的程序設計專題實際是計算機相關專業學生學習完《應用軟件開發實習》課程后,進行的一次全面的綜合訓練,程序設計的設計目的是加深對理論教學內容的理解和掌握,使學生較系統地掌握程序設計及其在網絡開發中的廣泛應用,基本方法及技巧,為學生綜合運用所學知識,利用軟件工程為基礎進行軟件開發、并在實踐應用方面打下一定基礎。
1.3 課程設計實驗環境
程序運行在安裝有windows操作系統的計算機上(臺式機和筆記本),兼容windows 2K/XP/Vista/7/8 計算機硬件基本要求(僅供參考): 1.2.3.CPU:1G; 內存:512M.; 顯卡:256M顯存;
文件播放:需要安裝有聲卡、要求安裝有語音庫。
JAVA程序設計語言及相應的集成開發環境,Myeclipse和Netbeans開發工具。
廣東海洋大學本科生課程設計報告
1.4 課程設計要求
按課程設計指導書提供的課題,要求學生在自行完成各個操作環節,并能實現且達到舉一反三的目的,完成一個項目解決一類問題。要求學生能夠全面、深入理解和熟練掌握所學內容,并能夠用其分析、設計和解答類似問題;對此能夠較好地理解和掌握,能夠進行簡單分析和判斷;能編寫出具有良好風格的程序;掌握JAVA程序設計的基本技能和面向對象的概念和方法;了解多線程、安全和網絡等編程技術。同時培養學生進行分析問題、解決問題的能力;培養學生進行設計分析、設計方法、設計操作與測試、設計過程的觀察、理解和歸納能力的提高。課程系統分析
2.1 程序界面布局設計
(1)創建一個JFrame類,類名為MyPlayer類。
(2)向對話框中添加JSlider控件、JList控件、JLabel控件、JJToggleButton控件、MenuBar菜單、JPanel容器、JToolBar容器以及JScrolPanel容器。
(3)設置所添加的控件的屬性,以及使用Java的界面風格,本設計共使用了6種Java 的不同界面風格。
2.2 功能分析
MyPlayer播放器主要對常用Windows音頻格式的文件實現播放控制: ? 主界面功能
? 菜單欄功能
? 添加音樂;
? 添加音樂文件(即導入一個或多個音樂文件至列表當中); ? 添加音樂目錄(即導入文件夾中所有的音樂文件至列表當中); ? 控制;
? 隨機播放; ? 順序播放; ? 單曲循環;
? 設置歌詞(有待開發); ? 更換皮膚;
? 默認、深海世界、迷人金屬、香韻咖啡、駭客帝國、浪漫滿屋(均為java的界面風格)
? 關于;
廣東海洋大學本科生課程設計報告
? 幫助(記錄作者的相關信息以及軟件開發的日期);
? 動態音頻播放進度顯示;
? 正在播放歌曲在頂層的顯示
? 播放歌曲的時間長度的顯示以及正在播放時間的長度的顯示 ? 滾動條隨播放狀態改變顯示 ? 歌曲搜索功能;
? 根據關鍵字搜索對應的歌曲; ? 歌曲播放/停止功能;
? 上一首;(播放上一首歌曲并根據播放模式來選擇)? 下一首;(播放下一首歌曲并根據播放模式來選擇)? 播放/停止;(播放或停止歌曲)
? 雙擊播放/雙擊停止;(在列表中對指定歌曲的操作)? 列表展示功能;
? 隱藏/顯示列表; ? 移除單個音樂文件; ? 移除所有音樂文件;
? 顯示當前歌曲數目,播放模式,皮膚情況; 系統設計與實現
3.1 系統功能結構圖
MyPlayer播放器的功能結構圖如圖3-1。
主界面功能菜單欄功能動態音頻播放進度顯示歌曲搜索功能歌曲播放/停止功能列表展示功能
圖3-1 主界面功能圖
3.2 模塊功能設計 3.2.1 “菜單欄”功能設計
“菜單欄”功能結構圖如圖3-2-1。
廣東海洋大學本科生課程設計報告
菜單欄功能添加音樂添加音樂文件添加音樂目錄控制更換皮膚關于隨機播放順序播放單曲循環種皮膚圖3-2-1菜單欄功能結構
6幫助 3.2.1.1 “添加音樂”功能實現
當點擊“添加歌曲/文件夾”選擇“添加本地歌曲”或“添加本地歌曲文件夾”的時候,這時候會觸發這兩個JMenuItem事件,調用了open()函數(opendir()函數),即將選中的音樂文件(或文件夾內所有音樂文件)的信息(名稱與路徑)放入nameVector 和 urlVector 當中。并修改listCount的值,顯示歌曲的總數,最后將nameVector的所有內容放入list列表當中。如圖3-2-1-1。
圖3-2-1-1(左上)選擇操作,(左下)選擇目錄,(右下)列表顯示
廣東海洋大學本科生課程設計報告
3.2.1.2 “控制”功能實現
當選擇“控制”功能的任意一項,則會使全局的chosenMethod整型變量的值根據選擇的項賦對應的值,值域為1(隨機播放)、2(順序播放)、3(單曲循環)。因播放器的播放功能是一個while(true)的循環,每當播放歌曲時候,播放前會由函數chooseNextSong()根據chosenMethod的值來選擇下一首歌是那一首。
如果值是1,則會由[0,listCount(列表歌曲總數)],獲取隨機數,再根據play()函數播放;如果值是2,則根據chosenIndex(當前播放歌曲號),直接加一,再根據play()函數播放;如果值是3,則chosenIndex(當前播放歌曲號)的值不再修改,再根據play()函數播放;如圖3-2-1-2。
圖3-2-1-2(左上)選擇操作;(左下)隨機播放后歌曲序號,(此處為后臺顯示),起始播放第1首歌,下一首歌為第295首歌曲;(右側)為列表顯示,指向對應歌曲,并且列表底下顯示“隨機播放”
3.2.1.3 “更換皮膚”功能實現
當選擇“更換皮膚”功能的任意一項,則會觸發對應事件的發生,調用函數loadskin1()或loadskin2()等等。此時會調用LookAndFeel的類,指定java包含的皮膚風格。Loadskin1()對應“默認”,loadskin2()對應“深海世界”等等。
選擇皮膚后,主界面底下會顯示對應的提示,如選擇了“浪漫滿屋”,地下就會顯示 “皮膚:浪漫滿屋”。如圖3-2-1-3所示。
廣東海洋大學本科生課程設計報告
圖3-2-1-3
(左)選項顯示,(右)換膚后主
界面情況。
3.2.1.4 “關于”功能實現
當選擇“幫助”功能時,則彈出信息窗口,提示本軟件的開發時間與開發人員相關信息。如圖3-2-1-4所示。
圖3-2-1-4
廣東海洋大學本科生課程設計報告
3.2.2 “動態音頻播放進度顯示”功能設計
當歌曲播放正在播放時,則頂層“正在播放”處會顯示歌曲的名稱,當歌曲名稱過長時候,超長部分會用省略號顯示。
同時會根據歌曲的格式,得到歌曲的長度,并顯示在歌曲的右側的JLabel fileTime中;另外會另起一個線程RunSlider來控制計時功能,每1秒鐘,滾動條左側JLabel runningTime 會根據播放的時間來修改,滾動條PlayerSlider則會每秒鐘根據runingTime的值來移動。如圖3-2-2所示
圖3-2-2
正在播放歌曲中的動態播放進度顯示。
3.2.3 “歌曲搜索”功能實現
在搜索欄中輸入關鍵字,在回車確認,系統就會調用seachMusic()來搜索與關鍵字吻合的歌曲,并將其放入臨時的Vector tmpName當中,并顯示其到list列表當中。如圖3-2-3-1
在臨時的列表中選擇所需要播放的歌曲,雙擊播放,同時臨時列表消失,回復原來的列表,即導入nameVector的數據到list當中。
當點擊“X”按鈕,若還在臨時列表當中,則會清除臨時列表并且恢復原來的列表;若已經恢復到臨時列表,則搜索框中會返回提示“請輸入搜索關鍵字...”。
圖3-2-3-1(上)搜索“陳奕迅”的歌曲
(下)取消搜索后,搜索框的內容
廣東海洋大學本科生課程設計報告
3.2.4 “歌曲播放/停止”功能實現
“歌曲播放/停止”功能結構圖如圖3-2-4。
歌曲播放/停止功能上一首下一首播放/停止雙擊播放/停止
圖3-2-4 “歌曲播放/停止”功能結構
3.2.4.1 “上一首”“下一首”功能實現
當點擊“上一首”的按鈕時,會根據按鈕事件,若chosenMethod(播放方式)的值為1(即隨機播放)則系統會調用chooseNextSong()來隨機選擇歌曲號來播放下一首歌;若chosenMethod不為1,則會調用previousMusic(),對chosenIndex(當前播放歌曲號)減一,再調用play()函數播放上一首歌曲。
當點擊“下一首”的按鈕時,會根據按鈕事件,若chosenMethod(播放方式)的值為1(即隨機播放)則系統會調用chooseNextSong()來隨機選擇歌曲號來播放下一首歌;若chosenMethod不為1,則會調用nextMusic(),對chosenIndex(當前播放歌曲號)加1,再調用play()函數播放下一首歌曲。
3.2.4.2 “播放/停止”“雙擊播放/停止”功能實現
當點擊“播放/停止”的按鈕時候,若點擊了“播放”,則會顯示“停止”,同時會對列表正在選中的歌曲進行播放。同時會觸發“動態音頻播放進度顯示”功能(3.2.2節所介紹),更改或增加播放信息;
若點擊了“停止”,則會顯示“播放”,同時會對當前播放的歌曲進行停止,同樣會觸發“動態音頻播放進度顯示”功能,清除對應的顯示。如圖3-2-4-2
廣東海洋大學本科生課程設計報告
圖3-2-4-2(左)“播放”
(右)“停止”
3.2.5 “列表展示”功能實現
“列表展示”功能結構圖如圖3-2-5。
列表展示功能隱藏/顯示列表移除音樂文件顯示列表信息
圖3-2-5 “列表展示”功能結構
3.2.5.1 “隱藏/顯示列表”功能實現
當點擊“顯示列表/隱藏列表”的按鈕時候,若點擊了“顯示列表”,則會顯示“隱藏列表”,同時觸發該事件,將原來的JFrame大框架的長度減少440個單位;
若點擊了“隱藏列表”,則會顯示“顯示列表”,同時觸發該事件,將原來的JFrame大框架的長度增加440個單位。
隱藏與顯示列表這一功能雖然非常簡單,但其重要性不可忽視,對于現在許多用戶對音樂播放器的要求,就如自己的手機或著MP3一樣,小巧、靈活、精致,至此這一項功能對于本小組一開始的設計就算是一個亮點。如圖3-2-5-1所示。
廣東海洋大學本科生課程設計報告
圖3-2-5-1(左)隱藏列表,(右)顯示列表
3.2.5.2 “移除歌曲”功能文件實現
當用鼠標對著列表的音樂文件右鍵的時候,會彈出兩個選項“移除歌曲/移除所有歌曲”。
當選擇“移除歌曲”,則對所選擇的音樂文件從列表中移除,即事件的觸發調用了deleteSingle()函數,將對應的項從列表中移除,從nameVector中移除,從urlVector中移除;
同理當選擇“移除所有歌曲”的時候,事件觸發調用deleteAll()函數,將列表清空,將nameVector中的元素清除。
以上兩者運行過后均會更新主界面底層“歌曲數目”,并且停止正在播放的歌曲。
圖3-2-5-2右鍵列表后出現的選擇項
廣東海洋大學本科生課程設計報告
3.2.5.3 “顯示列表信息”功能實現
由“添加音樂”功能(3.2.1.1節)調用的open()、opendir()函數,會將保存在nameVector中的內容導入列表當中。當雙擊列表中的歌曲的時候,如果歌曲正在播放則會停止,如果播放器沒有進行播放,則雙擊后就進行播放。
當我們對著列表右鍵時,則會彈出列表,“移除歌曲/移除所有歌曲”,詳見(3.2.5.2節)系統優點與缺點
4.1 系統優點
1、windows界面風格可選擇性,如上如所述,本音樂播放器具有6種皮膚可以更換。這大大滿足了一個娛樂性的軟件的需要,并且皮膚起名也符合用戶的感官需求,像“深海世界”、“浪漫滿屋”這些貼切而休閑的詞匯更能吸引用戶對播放器的使用。
2、播放方式可選擇性,對于喜歡聽音樂的用戶,會根據自己的需要選擇一定的順序來聽音樂。
3、列表隱藏的功能,符合大眾播放器的功能,將播放器的界面弄得小巧而精致,即使隱藏了列表也不妨礙主要的播放器功能。
4、搜索功能,隨著網絡的發達,音樂歌曲隨處下載,人均播放列表的歌曲數目數以百計,這時候搜索功能就顯得十分重要。本播放器根據關鍵字可以對列表進行搜索,并可以顯示搜索后的列表,同時臨時的列表不會縮減播放器功能。
4.2 系統缺點
1、本系統主要代碼均在一個文件當中MyPlayer.java當中,由于本小組是用netBeans7.2.1開發平臺開發的,對開發平臺尚未了解,故暫且沒有將代碼弄得更具有可讀性。
2、本播放器還缺少暫停功能,在開發的最后版本(Music_Player0.9fornetBeans)還在改進當中。期待1.0版本對此功能的實現。
3、本播放器對音樂文件的選擇,僅僅.mp3文件以及.wav文件可播放。針對decodeMusic()解碼函數的改善,尚未能解決。
4、本播放器缺少歌詞設置、顯示功能。由于本小組對播放器的主界面還未想到一個滿意的設計,所以歌詞的實現暫且沒有實現,待界面設計得靈活的時候,再添加歌詞的功能。
廣東海洋大學本科生課程設計報告 系統開發過程
Myeclipse平臺開發版本
Version 0.1
1、菜單欄
*文件包括“打開文件”“打開目錄”“退出程序” *控制-隨機播放-順序播放-單曲循環-設置歌詞 *更換皮膚
*幫助-關于
2、上一首、下一首、停止/播放、隱藏列表4個button
3、幫助顯示-關于 消息框。
Version0.2
1、能打開文件,顯示文件名稱在下面的框內,多個文件顯示在框內!
2、文件-退出程序
實現
3、能夠顯示列表與隱藏列表
Version0.3
1、雙擊能夠播放
2、暫停 跟 繼續
新增
1、雙擊整個title 換成為歌曲名稱 問題
1、隱藏列表/顯示列表 list 會縮水
2、filedialog 沒有選擇任何文件 直接關閉會出現錯誤!(verson0.4中已解決)
3、雙擊空的列表也可以開始(version 0.6for netBeans 已經解決)
Version0.31(Version0.3崩潰)
Version0.4
1、上一首,下一首 能夠在列表中顯示
2、上一首 下一首播放功能 新增:
1、打開文件可以多選
2、打開目錄 可以把整個目錄里面的MP3、wav文件導出在列表中。
問題:
1、雙擊 第一次 是開始,第二次 是停止(相對于同一首歌,相對于其它歌會停止,也不播放)(version 0.6for netBeans 已經解決)
2、播放完一首歌后,不能自動往下播放。(version 0.5forneatBeans 已經解決)
歌曲不能刪除(version 0.6for netBeans 已經解決)修改:
1、“打開文件”“打開目錄”分別換成 添加本地歌曲,添加本地歌曲文件夾
Version0.5
1、皮膚(簡單的顏色或者圖片)
2、更換皮膚-可供選擇
修改:
1、項目已經轉至netbeans平臺上開發,并明明為Music_Player0.5forneatBeans 新增:
1、快捷鍵 添加歌曲/文件夾 添加了快捷鍵 和 關于 加了快捷鍵
廣東海洋大學本科生課程設計報告
Version 0.6
1、播放模式
2、刪除功能 問題:
1、播放列表可以拉出來,播放到名字比較長的歌曲,list會變寬!(已經完全解決,刪
除正在播放的label)
2、播放按鈕,雙擊 未解決(version0.6已經修復),上一首
下一首 置頂時候,以及
隨機播放時候 下一首上一首序號問題!(version0.6已經修復)。
3、菜單項 選中后,沒有特別標志(解決辦法
1、換另外一種菜單項
2、選中菜單項后 字
體等改變)
selected 方法!是改變修改字體的?。╲ersion0.7添加1中 解決)
4、刪除 單首歌,序號不能改變(version0.7已經修復)NetBeans開發平臺版本
Version0.7 for netbeans
1、添加底下: 歌曲數目、播放模式、皮膚的顯示
2、歌曲名前面有序號
3、音樂時間,以及滾動條
4、”正在播放“顯示的問題 Version0.8 for netbeans
1、添加搜索模塊
2、添加搜索功能
3、搜索功能->搜索列表播放功能 Version0.9fornetbeans
1、修改播放器軟件運行時的圖標(將java的圖標換成“射手”圖標)
廣東海洋大學本科生課程設計報告 設計總結
JAVA是目前最流行的軟件開發語言之一,稱為網絡上的“世界語”。JAVA適合開發基于多媒體、與平臺無關、用面向對象的方法進行的基于Internet、Intranet、Extranet的Applet和應用程序。它具有簡單高效、面向對象、不依賴于機器結構的特點,支持多線程、分布和并發機制。用JAVA開發的應用軟件在可移植性、健壯性、安全性等方面大大優于已存在的其他編程語言。
JAVA是一門包含多種知識的學科,提供了豐富的類庫,能最大限度地利用網絡。JAVA可廣泛用于面向對象的事件描述、處理面向對象的企業型的應用開發,還應用于Internet系統管理、Web頁面設計、Internet可視化軟件開發等方面。在學習的過程中我學到了許多以前沒有學到的概念和新鮮資訊。運用這些知識可以完成老師交給我的課程設計任務。這次老師讓我們自己擬訂題目,給了我們很大的想象空間。我們自選了一個音樂播放器的課程設計題目。
課程設計的過程雖然是艱難而辛苦的,但是我卻從中感到了快樂與欣慰??鞓肥且驗槲乙郧皩τ贘AVA的知識可以說是孤陋寡聞,但是通過這次課程設計我使自己的知識更加的豐富了,加大了自己的知識面。讓自己的實力擴大了。所以我感到非常的快樂。欣慰是因為看著自己做出的課程設計得到了老師的認同,取得了成功。這次課程設計的整體過程是充實而滿足的。
廣東海洋大學本科生課程設計報告
參考文獻
[1](美)??藸枺‥ckel , B.)著,《Java編程思想》(第四版)陳昊鵬譯.一北京: 機械工業出版社,2007.6
[2] 刁成嘉 著,《UML系統建模與分析設計》,機械工業出版社,2007.6
[3] 朱喜福 著,《Java程序設計》(第2版),清華大學出版社, 2009.10
[4] 辛運幃 著,《Java語言程序設計》(第1版),人民郵電出版社, 2009.10
[5] 葉核亞 著,《Java程序設計實用教程》(第3版),電子工業出版社,2010.2
[6] 耿祥義,張躍平編著,《Java面向對象程序設計》.一北京:清華大學出版社,2010.1
廣東海洋大學本科生課程設計報告
附
錄
關鍵代碼
1、音樂解碼函數(decodeMusic)
解析:由于java applet播放聲音,對應的格式只有一些原始格式如.au、.Wav、.Midi、.rfm格式,因此一下的解碼函數就非常必要了,即將MP3等其它格式文件的音頻等格式修改成系統能夠實現的格式,并寫入內存由此來實現播放功能。詳細實現請閱讀如下代碼。
public void decodeMusic(AudioInputStream in){// 開始解碼 MP3
AudioFormat format = in.getFormat();
AudioFormat decodedFormat = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED,// 音頻編碼技術
format.getSampleRate(),// 每秒的樣本數
16,// 每個樣本中的位數
format.getChannels(),// 聲道數(單聲道 1 個,立體聲 2 個,等等)
format.getChannels()* 2,// 每幀中的字節數
format.getSampleRate(), false);// 每秒的幀數和是否以 big-endian // 字節順序存儲單個樣本中的數據
// 然后重新獲取一個新的輸入流,AudioInputStream decodeIn = AudioSystem.getAudioInputStream(decodedFormat, in);/**
* 源數據行是可以寫入數據的數據行。它充當其混頻器的源。應用程序將音頻字節寫入源數據行,這樣可處理字節緩沖并將它們傳遞給混頻器。
* 混頻器可以將這些樣本與取自其他源的樣本混合起來,然后將該混合物傳遞到輸出端口之類的目標(它可表示聲卡上的音頻輸出設備)。
* */ SourceDataLine sdl = null;// 然后
DataLine.Info info = new DataLine.Info(SourceDataLine.class,decodedFormat);try {
/**
* AudioSystem :類充當取樣音頻系統資源的入口點。此類允許查詢和訪問安裝在系統上的混頻器
* **/
sdl =(SourceDataLine)AudioSystem.getLine(info);
sdl.open(decodedFormat);
} catch(Exception e){
廣東海洋大學本科生課程設計報告
e.printStackTrace();} /** 指示該行是否支持特定類型的控件。*/ if(sdl.isControlSupported(FloatControl.Type.PAN)){
// FloatControl 對象提供對浮點值范圍的控制
FloatControl pan =(FloatControl)sdl
.getControl(FloatControl.Type.PAN);
if(curPosition == Position.RIGHT){
pan.setValue(1.0f);
} else if(curPosition == Position.LEFT){
pan.setValue(-1.0f);
} }
sdl.start();int nBytesRead = 0;byte[] abData = new byte[EXTERANAL_BUFFER_SIZE];try {
while(nBytesRead!=-1){
// 文件流的讀寫
nBytesRead = decodeIn.read(abData, 0, abData.length);
if(nBytesRead >= 0){
sdl.write(abData, 0, nBytesRead);
}
} } catch(Exception e){
e.printStackTrace();
return;} finally {
// 通過在清空數據行的內部緩沖區之前繼續數據 I/O,排空數據行中的列隊數據。
sdl.drain();
sdl.close();}
}
廣東海洋大學本科生課程設計報告
2、播放線程類(class PlayThread)
解析:本播放器只使用一個線程來實現歌曲播放的功能,若用戶要更換歌曲或者停止音樂,則對線程重建,即殺死原線程再建立新的線程,其實現的效果還是跟原來線程一樣。同時此線程包含了許多子功能,如更改播放模式,對“上一首”“下一首”顯示“正在播放”等功能均在此線程上實現。詳細內容請閱讀如下代碼。
class PlayThread extends Thread{
public void run(){
while(true){
try {
setInitShowing();//初始化滾動條以及計時label 的值
isStop = true;//標志狀態,說明是停止了
filename =(String)nameVector.get(chosenIndex).toString();//取chosenIndex對應的歌曲名稱
filepath =(String)urlVector.get(chosenIndex).toString();////取chosenIndex對應的歌曲路徑
System.out.println(“我在播放:”+chosenIndex+“ ”+filename);//后臺輸出檢測
/*設置“正在播放”的值,只輸出前23個字符,以免超出長度,后面補...*/
String showName = null;
if(filename.length()>23){
showName = filename.substring(0, 23)+ “..”;
}else{
showName = filename;
}
showTileOfMusic.setText(“正在播放:”+showName);
File file = new File(filepath);
setTitle(filename);
list.setSelectedValue(nameVector.get(chosenIndex), true);
listIndex = chosenIndex;
stporplySongButton.setText(“停止”);//修改 停止/播放button的狀態值
AudioInputStream in = AudioSystem.getAudioInputStream(file);//去音樂文件
AudioFileFormat aff = AudioSystem.getAudioFileFormat(file);//去音樂文件的格式(為了得到歌曲長度)
musicLength = aff.getFrameLength()/aff.getFormat().getFrameRate();//取音樂文件的長度
System.out.println(“我有那么長:”+musicLength);//后臺顯示,用于檢測
setShowingTime(musicLength,fileTime);//顯示總長度到fileTime label中
PlayerSlider.setMaximum((int)musicLength);//并且設置滾動條的最大值
isStop = false;//設置正在播放狀態
hasStop = false;//設置正在播放狀態
decodeMusic(in);//解碼并播放
isStop = true;//播放完畢后設置回非播放狀態
hasStop = true;
廣東海洋大學本科生課程設計報告
chooseNextSong();//選擇下一首歌返回while
} catch(Exception e){
//e.printStackTrace();
System.out.println(“剛才那首歌出錯了!”);//如果出現錯誤,則顯示直接跳至下一首歌
nextMusic();
}
}
}
}
3、控制滾動條類(class RunSlider)
解析:此類雖然簡短,但其能動態實現滾動條以及播放時間的運動。其中setShowingTime()方法提供的接口十分靈活,能夠對不同空間進行時間的控制,本播放器只對播放時間的兩個JLabel實現了此功能,這大大提高了本播放器的可擴展性。詳細內容請閱讀如下代碼。
class RunSlider extends Thread{
public void run(){
try {
musicCouter = 0;
while(true){
Thread.sleep(1000);//每秒鐘滾動一次
musicCouter++;
PlayerSlider.setValue((int)musicCouter);
setShowingTime(musicCouter, runingTime);//轉換時間并顯示回去runingTime label
}
} catch(InterruptedException ex){
Logger.getLogger(MyPlayer.class.getName()).log(Level.SEVERE, null, ex);
}
}
}
第四篇:JAVA課程設計報告_完整版
《JAVA面向對象程序設計》
課 程 設 計 報 告
(2011-2012學年第2學期)
系 別: 專業名稱:
廈門理工學院計算機科學與技術系
10級網絡工程1班
課程設計科目: 《JAVA面向對象程序設計》課程設計 學生姓名: 學 號: 指導教師: 成 績: 完成時間:
崔建峰
2012年7月6日
題目JAVA程序課程設計
任務一
手機號碼檢測器
(一)設計任務與目標
任務:
手機號碼是由11位數字構成,用戶在輸入手機號碼時經?;靵y輸入若干位數字或字母,要求你編寫一個程序檢測用戶所輸入的手機號碼是否符合規則。要求目標:
檢測所輸入的手機號碼是否是11位 檢測每一位是否都為數字。分析論證:
本題目要求對用戶輸入的手機號碼進行檢測,判斷輸入的正確性。曾經有做過類似字符比較的題目,可以借鑒。將字符的比較運用進來,把用戶的輸入字符和正確的進行比較。但是必須滿足多次輸入和錯誤提醒。同時還可以添加提示錯誤的位置和錯誤字符是什么。
程序正確運行時可以滿足以上功能,基本可以達到題目要求了。
(二)方案設計與論證
為了滿足多次輸入的要求,將提示和輸入的操作放在一個循環體中,我采用了do_whiele()循環。每次輸入結束后提示是否繼續輸入。
在循環中逐步對輸入的號碼位數和字符類型進行檢測。位數可以分超出和不足,并均給出錯誤提示。如果位數滿足要求后對手機號碼類型進行檢測。一般手機號在0~9之間,所以不滿足的字符將報錯。通過將輸入的整個字符串調用charAt(int i)方法對字符串逐位比較。
本程序的特點在于可以滿足了多次輸入和錯誤字符的顯示(內容和位置)。在程序的調試過程中,有過多次輸入正確的號碼也會報錯(還會報錯0位錯誤),這是因為記錄錯誤位子的變量放在錯誤條件下并且未在循環體中初始化為0。最終解決了此問題。
(三)程序框圖或流程圖,程序清單與調用關系
(四)程序運行的測試與分析
實現了多次輸入和錯誤提示,可以判斷輸入的號碼的錯誤位置及字符,錯誤類型,滿足了設計構思要求。最終結果如下圖:
實驗結果截圖:
(五)結論心得
實驗過程中對于判斷條件的選擇出現了問題,開始時覺得要對輸入的字符一個一個的比較,這樣增加了難度也不方便實現。后面改成了將用戶輸入完成后的全部字符串當做整體后再來逐位比較。如果能做成手機外形的面板并能一個一個 3 的判斷,只要輸入錯誤字符馬上提示,那功能將更加完善。
任務二
撲克牌
(一)設計任務與目標
任務:
設計一個Card類代表撲克牌,每張牌都有自己的花色和大小。創建一個DeskOfCards類保存54張撲克牌,設計洗牌、發一張牌、報告剩余牌數的方法。創建main方法測試你的程序。要求目標:
實現洗牌和發牌。
顯示當前片面和剩余牌數。
分析論證:
本題目需要用到數組來存儲一副紙牌,并需要用到隨機數來代替隨機發牌,曾經做過類似工作。現在需要將產生的隨機數和字牌的大小和花色聯系起來,可以通過數組來實現。同時還要達到可以循環發牌,并有發牌信息顯示。
(二)方案設計與論證
根據題目要求,我準備在類Card中用數組存儲一副牌(52張),考慮到撲克牌有花色和大小并都是固定的,所以用了兩個字符串數組分別初始化花色和大小,再利用下標操作把花色和大小組合在一起,存放另在一個數組里(最終的紙牌組)。這樣就有了一副完整紙牌了。
再創建另一個類DeskOfCard創建兩個Card對象,通過在循環里的條件判斷對對象進行操作:洗牌時就將紙牌數組和剩余牌數重新初始化(利用多余的那個對象)。發牌時用到隨機數產生器,產生從0到51的整數和數組小標對應,每個元素代表一張牌。
測試過程中出現了無法顯示牌面的問題,通過對象引用找不到具體的紙牌,后來在Card類中添加了getCard(int i)方法返回一張牌,實現了發牌和剩余牌數,并可以多次發牌。
(三)程序框圖或流程圖,程序清單與調用關系
(四)程序運行的測試與分析
從測試過程中達到了分析時的目的要求,實現了洗牌和發牌(顯示牌面和剩余數量)。最終結果如下圖:
實驗結果截圖:
(五)結論心得
實驗過程中,開始沒有將紙牌的大小和花色分開來定義,導致需要初始化52張牌,后倆采用了循環體將花色和大小進行組合達到了目的的同時又簡化了代碼,提高了可讀性。本來希望最后的結果可以通過圖片的方式顯示紙牌,但紙牌的原圖片兩太大,實現過于繁瑣,最終采用了簡單的文字表示。希望今后有機會近一步完善,達到預期效果。
任務三
計算器
(一)設計任務與目標
任務:
參考第六章的實驗題Telephone Keypad界面設計一個計算器。要求目標:
實現輸入數字和運算字符并輸出結果
結果由對應的運算得出,實現基本運算能力 分析論證:
通過設計一個界面展示一個計算器的功能,包括輸入數字和符號并進行準確的運算得出理想的結果。在第六章中的Telephone Keypad實驗中做過類似的界面只是實現的功能不一樣,可在這個基礎上加入運算功能即可實現要求。
(二)方案設計與論證
根據題目的具體要求,我設想通過之前的Telephone Keypad實驗進行改進,除了需要加入一些按鈕外,還要對具體的按鈕功能進行設計。在Calculator類中進行了面板的設計,之間加入了需要的各個控件,并且加了ActionListener()類來做事件的觸發類。
此類中通過event.getSource()方法與相應的按鍵進行對應,以此為判斷條件來決定做什么操作。其中包括了被運算數、運算類型、運算數還有等號的事件。
為了可以輸出信息還要加入JTextField控件來顯示信息,信息通過一個字 6 符串變量來存取。兩個JTextField控件分上下,上面顯示最后的運算式(包括每次輸入時均要逐步顯示輸入內容),下面顯示最后的結果并以一定的格式輸出。最后還要滿足多次輸入,因此設計了清楚按鍵,每次清楚后可以進行下一次的運算。
在程序的調試的過程中出現了,輸出內容的錯誤。不能逐一的輸出輸入的內容,最后也沒有在上面顯示框中顯示完整的運算式。通過檢查,發現是字符串的添加位置和沒有將內容在原有基礎上增加,而是每次更新字符串。最終通過修改解決了問題。其間,還出現了按鍵功能的一些的錯亂,都是小問題,多次調試后基本達到了一個簡單運算器的功能。
(三)程序框圖或流程圖,程序清單與調用關系
(四)程序運行的測試與分析
測試過程中進行了多次的運算,包括加、減、乘、除。每次都可以逐一輸出輸入的內容并能得出正確的結果并輸出。清除后可以再次運算,基本達到了預期要求。最終結果如下圖: 實驗結果截圖:
(五)結論心得
本程序因為涉及的控件很多,所以排版和引用都要十分注意,不然容易引用錯誤,導致引用不到你所點擊的那個按鍵等。還要注意在監聽器里的條件判斷時相應的操作要考慮清楚。為了界面美觀和人性化,要將按鍵的順序按一定的順序排列不能隨機添加。
本程序不足的地方在于運算類型只有加減乘除,并且不能再完成一次運算后立即進行下一次運算,必須清楚后重新開始。這些不足還有待改善。相信如果改進過后,這個計算器會達到更加完善的功能和實用性。
任務四
憤怒的小鳥
(一)設計任務與目標
任務:
憤怒的小鳥是一款“億人迷”的游戲,據說大家喜歡它的原因在于大家喜歡拋物線勝過直線。例題8.15-8.16是笑臉圖片直線運動的例子,請修改它在X軸和Y軸的運動軌跡,將它改成拋物線運動。
要求目標:
實現界面中小鳥打擊目標
有準確的拋物線
可以多次并操作簡單 分析論證:
在例題笑臉的運動中實現了圖片按照一定的像素進行平移,到達一個目標地。所以可以以此為基礎進行改進。對運動中的函數進行改進,將直線運動改成拋物線。并有效開始時出現提示。用戶可以對圖片的出發位置進行控制。
(二)方案設計與論證
為了達到預期的目標,我將創建了一個BirdPanel類來存放各種組件,主要是存入多張圖片和一個十分重要的也是這個程序的核心——定時器Timer。這個游戲最終可以看到的效果是圖片的移動,所以需要通過控制圖片在面板中的位置來實現移動。
所以定時器就十分重要了,有了定時器就可以在間隔一段時間中多次觸發事件,看到的也就是圖片在不停地移動,最終到達目標。
在編寫程序過程中,發現需要實現客戶對圖片初始位置的控制比較困難。所以為了節省時間就將圖片的觸發地限制在了固定位置。每次都將從這一位置觸發,并進行拋物運動后,打中目標。這雖然使程序簡單了,可在一定程度上犧牲了部分的功能。今后還有需要改進。
(三)程序框圖或流程圖,程序清單與調用關系
(四)程序運行的測試與分析
實驗測試過程完成了游戲開始提示和小鳥圖片的拋物運動,目標被打擊后會場上變化。只是不能多次操作和隨意拖拽小鳥的起始位置,這是一段的局限。最終結果如下圖:
實驗結果截圖:
(五)結論心得
本題目中涉及的核心內容是定時器和圖片坐標改變在(運動)的配合使用。通過對坐標的改變,并結合定時器功能達到動畫效果。
本程序的不足在于未能達到預期的人性化,沒法隨意開始游戲,和市場上的憤怒的小鳥存在巨大差距,這也是這個程序不成熟的地方,但是總算達到了能將圖片以拋物線運動到目的地?;旧贤瓿闪四康囊?。今后還需繼續改進完善。
任務五
石頭剪刀布
(一)設計任務與目標
任務:
參考第五章的實驗題Rock, Paper, Scissors設計并實現一個和計算機交互的剪刀、石頭、布游戲。人和計算機各選擇一項,然后決出勝負。程序必須隨機選取一項但不表示出來,然后提示用戶選擇。當用戶選擇后,程序同時顯示出計算機和用戶的選擇并且輸出游戲結果。游戲一直進行直到用戶退出為止,并且輸出雙方輸贏次數和總局數。要求目標:
能夠直觀顯示用戶和電腦的出拳
可以多次進行游戲,知道用戶確認退出
每次都給出目前勝負情況
游戲具有隨機性和準確性 分析論證:
由于第五章中已經編譯過類似的程序,其是通過隨機數模擬電腦出拳,在通過用戶輸入模擬自己出拳,最終來比較電腦和用戶的勝負。只要將原程序改成界面形式并加入具體相應的圖片和用戶勝負情況的提示,其他的游戲比較與原來一致就行。
(二)方案設計與論證
根據題目要求需要建立一個Panel’類Fight用于存儲圖片和組件。在類 12 中申請了3個panel,第一個用于存放圖片,第二個用于存放按鍵,最后將這兩個放進panel3中。在panel1中的圖片需要根據panel2中按鍵觸發的事件進行相應的改變。電腦和用戶都有石頭、剪刀和布三張圖片進行變化。每次在用戶點擊按鍵石頭或剪刀或布后電腦會根據隨機數產生器發出的隨機數進行相應的“出拳”,然后和用戶選擇的“出拳”進行比較輸贏。當用戶選擇后,兩者的出拳圖會顯示在panel1中,并出現信息說明當前游戲總次數和用戶和電腦各自的勝出次數。用戶可以再一次游戲介紹后繼續點擊按鍵進行多次游戲,每次重復上面功能。
因為本程序是在原有基礎上進行的改進,前面又做過小鳥的程序,所以問題不是很大,最不應該的是在圖片引用過程中因為圖片命名格式的原因耽誤了大量時間,導致實驗用時較長。最終完成的游戲還是比較完善的,幾乎達到了預期的所有要求。
(三)程序框圖或流程圖,程序清單與調用關系
(四)程序運行的測試與分析
本程序運行正常,實現了用戶點擊按鍵嘗試相應的圖片,同時電腦也會產生相應的回應發出它的“猜拳”,每一次都會給出當前的游戲總局數和用戶和電腦各自的勝利局數。并且可以隨意進行多次,每次的隨機性和準確性良好。界面也較清楚好看。最終結果如下圖: 實驗結果截圖:
(五)結論心得
本題經過較長時間的調試和完善,達到了預期要求和運行目標。這是本次設計用時最長的題目花了大量時間,最后總算有所回報,到達了一個比較滿意的成果。
任務六
學生考勤管理系統
(一)設計任務與目標
任務:
考勤信息記錄了學生的缺課情況,它包括:缺課日期、第幾節課、課程名稱、學生姓名、缺課類型(遲到、早退、請假及曠課)。試設計考勤管理系統,使之能提供以下功能: 要求目標:
(1)錄入學生的缺課記錄;
(2)修改某個學生的缺課記錄;(3)查詢某個學生的缺課情況;
(4)統計某段時間內,曠課學生姓名及曠課次數;(5)統計某段時間內,有學生曠課的課程及曠課人次; 分析論證:
本題需要通過用戶界面來直觀的實現操作,操作盡量簡單方便,可以實現上述基本功能。主要以之前的對話框等GUI組件來實現用戶的交互??梢暂斎牒筒樵兿鄳男畔⒁约疤崾拘畔?,并可以實現簡單統計。
(二)方案設計與論證
本題我設計了一個主面板來承載多個
panel;其中最重要的是JTabbedPane組件,它先承載了主要的按鍵及菜單和各個文本輸入框。其他的面板主要是安放在JTabbedPane上,并且要求面板中的組件按一定規律排列,用到了布局管理器。
需要實現的功能主要是錄入、修改、查詢和統計信息。程序中我分塊編寫了各個功能的代碼,每個功能都將用到相應監聽器,通過按鍵實現功能。并且在panel類中用到了student類,用于保存基本的學生信息。
在程序的編譯和調試過程中出現了許多問題。開始時面板布局凌亂,輸入信息沒有反應,并且還會出現報錯。在布局問題上后來用到了布局管理器,編程時將各個功能的版式按照一定的樣式統一設計,達到界面簡潔美觀。輸入信息沒反應主要是事件反應器的邏輯錯誤,經過調整判斷條件等改正了錯誤。最后,根據老師提出的要求最程序提出了完善,可以通過姓名和學號查 詢信息,以及不會重復輸入同一個人的信息?;具_到實驗目的。
(三)程序框圖或流程圖,程序清單與調用關系
(四)程序運行的測試與分析
經過調試,程序可以正常運行??梢詫崿F信息的輸入和查詢以及修改和統計信息數量。界面布局較合理,實驗截圖如下:
實驗結果截圖:
(五)結論心得
本題設計時涉及很多的組件和方法,需要將大量的組件安排到合適的位置,并且要實現相應的功能。工作量較大,在完善過程中問題也很多。不過通過自己的努力和思考,最終成功的完成了實驗。實驗收獲眾多,了解了一個較復雜和大段的代碼編寫時需要耗費很大精力。
參考資料
【1】 【美】John lewis,William Loftus 著《Java程序設計教程》(第六版)——電子工業出版社
【2】 【美】Y.Daniel Liang 著《Java語言程序設計》(基礎篇)——機械工業出版社 【3】 百度知道——http://zhidao.baidu.com/question/33715635.html
【4】 百度文庫——http://wenku.baidu.com/view/c1be6c19c281e53a5802fff1.html
致謝
本次可是設計能夠完成的這樣順利需要感謝很多人,這其中就包括軟件班的王浩同學,憤怒的小鳥這個程序借鑒了他的設計。還有就是本班的黃康杰的同學,他在我調試程序時給出一些好的建議,幫我解決了問題。特別需要感謝的事我們的崔劍鋒老師,是您一個學期以來的嚴格要求和教導,給我傳授知識,今天才能完成這個課程設計。在這里衷心的對這些給過幫助的人們表示感謝!
附錄:全部源程序清單
源代碼一:手機號碼檢測器 import java.util.Scanner;//手機號碼檢測器 public class Phone { public static void main(String[] args){ 17 String phone,str;char y;int x,m,a;Scanner scan=new Scanner(System.in);do { System.out.println(“請輸入電話號碼:”);phone=scan.next();x=phone.length();if(x<11)System.out.println(“輸入錯誤,位數不足!”);else if(x>11)System.out.println(“輸入錯誤,位數過多!”);if(x==11){ for(int i=0;i<11;i++){
y=phone.charAt(i);
if(y>='0'&&y<='9')
{ a++;
m=0;a=0;
else
}
else
m=i+1;
}
if(a==11)
System.out.println(“輸入完成!”);else {
System.out.println(“輸入錯誤!”);
System.out.println(“第 ”+m+“ 位輸入錯誤字符 ”
+phone.charAt(m-1));} }
System.out.print(“繼續輸入嗎(Y/N): ”);str = scan.next();}while(str.equals(“Y”));System.out.println(“退出輸入!”);} } 源代碼二:撲克牌
//************************************* // Card.java // 主類定義紙牌的花色和大小
//************************************* 19
public class Card {
private String[] card,bao;private int a=0;public Card(){ String[] card1 = { “黑桃”, “紅桃”, “梅花”, “方塊” };//定義兩個數組用于組
String[] card2 = { “A”, “2”, “3”, “4”, “5”, “6”, “7”, “8”, “9”, “10”,“J”, “Q”, “K” };
card=new String[52];bao=new String[52];for(int i = 0;i < 4;i++){ for(int j = 0;j < 13;j++){ card[a]=card1[i].concat(card2[j]);bao[a]=card[a];a++;} } } public String getCard(int i){
return card[i];}
}
import java.util.Scanner;public class DeskOfCard { private static int count=52;public static void main(String[] args){
String string,string2;
Card m=new Card();
Card n=new Card();//這里設定52張牌
Scanner scan =new Scanner(System.in);
do
{
System.out.println(“輸入您要的操作(xipai or fapai):”);
string = scan.next();if(string.equals(“xiapi”)){
m=n;//初始化牌組
count=52;//重新設定計數器
System.out.println(“剩余牌數:”+count);
} else if(string.equals(“fapai”))
{
if(count!=0)//判定牌是否發完
{
count--;
int r =(int)(Math.random()* 52);// 獲取隨即數
System.out.println(“抽取的牌為: ”+m.getCard(r)+“,剩余撲克牌數為: ”+count);// 輸出撲克牌
} // 從ArrayList中去掉已抽到了撲克牌
else
System.out.println(“牌已經抽完”);
}
System.out.println(“Want to again(Y/N): ”);
string2=scan.next();}while(string2.equals(“Y”));
}
}
源代碼三:計算器 import java.awt.*;import java.awt.event.*;import java.text.DecimalFormat;import javax.swing.*;import javax.swing.border.BevelBorder;
//創建Calculator類,繼承自JFrame,實現接口ActionListener public class Calculator extends JPanel { //聲明相關變量、對象,具體作用下面再逐行講解
private DecimalFormat df;private JTextField jieguo,jieguo2;private JButton[] button;private JPanel panel1,panel2,panel3;private double result,num1,num2;private int yunsuan,kong1 = 0;private String s = “", s1 = ”“,s2= ”“;public Calculator()//構造方法
{
df = new DecimalFormat(”0.0000“);//設置結果小數點位數
jieguo = new JTextField(20);
jieguo.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
jieguo.setBackground(new Color(240,245,254));
jieguo.setEditable(false);22
jieguo2 = new JTextField(20);
jieguo2.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
jieguo2.setBackground(new Color(240,245,254));
jieguo2.setEditable(false);
panel1 = new JPanel();
panel1.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
panel1.setLayout(new BoxLayout(panel1,BoxLayout.Y_AXIS));
panel1.setBackground(new Color(240,245,254));
panel1.add(jieguo);
panel1.add(jieguo2);
panel2 = new JPanel();
panel2.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
panel2.setBackground(new Color(229,238,250));
panel2.setLayout(new GridLayout(5,4,4,4));
//各個按鈕的名字
String name[] ={”1“,”2“,”3“,”+“,”4“,”5“,”6“,”-“,”7“,”8“,”9“,”*“,”0“,”.“,”=“,”/“,”C“};
button = new JButton[name.length];
for(int i = 0;i < name.length;i++)//實例化各個按鈕
{
button[i] = new JButton(name[i]);
button[i].setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED));
button[i].setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
button[i].setPreferredSize(new Dimension(5,35));
button[i].addActionListener(new ButtonListener());
panel2.add(button[i]);
}
panel3 = new JPanel();
panel3.setBackground(new Color(229,238,250));//設置布局管理
panel3.setLayout(new BoxLayout(panel3,BoxLayout.Y_AXIS));
panel3.add(panel1);
panel3.add(Box.createRigidArea(new Dimension(0,30)));
panel3.add(panel2);
add(panel3);
} private class ButtonListener implements ActionListener 23 { public void actionPerformed(ActionEvent event){
//沒有輸入加減乘除時空=0,記錄被運算數
if(kong1 == 0)
{
if(event.getSource()== button[0])
s1 += 1;
if(event.getSource()== button[1])
s1 += 2;
if(event.getSource()== button[2])
s1 += 3;
if(event.getSource()== button[4])
s1 += 4;
if(event.getSource()== button[5])
s1 += 5;
if(event.getSource()== button[6])
s1 += 6;
if(event.getSource()== button[8])
s1 += 7;
if(event.getSource()== button[9])
s1 += 8;
if(event.getSource()== button[10])
s1 += 9;
if(event.getSource()== button[12])
s1 += 0;
if(event.getSource()== button[13])
s1 += ”.“;
//當鍵入加減乘除后,設置kong=1
if(event.getSource()== button[7] || event.getSource()== button[3] ||event.getSource()== button[15] || event.getSource()== button[11])
{
num1 = Double.parseDouble(jieguo.getText());
//記錄運算類型
if(event.getSource()== button[3])
{
yunsuan = 1;
s1 += ”+“;
} 24
if(event.getSource()== button[7])
{
yunsuan = 2;
s1 += ”-“;
}
if(event.getSource()== button[11])
{
yunsuan = 3;
s1 += ”*“;
}
if(event.getSource()== button[15])
{
yunsuan = 4;
s1 += ”/“;
}
kong1 = 1;}
s = s1;jieguo.setText(s);} //此時記錄運算數 if(kong1 ==1){ if(event.getSource()== button[0])
s2 += 1;if(event.getSource()== button[1])
s2 += 2;if(event.getSource()== button[2])
s2 += 3;if(event.getSource()== button[4])
s2 += 4;if(event.getSource()== button[5])
s2 += 5;if(event.getSource()== button[6])
s2 += 6;if(event.getSource()== button[8])
s2 += 7;if(event.getSource()== button[9])
s2 += 8;if(event.getSource()== button[10])
s2 += 9;if(event.getSource()== button[12])
s2 += 0;
誤
if(event.getSource()== button[13])
s2 += ”.“;s =s1+ s2;jieguo.setText(s);//重復出現運算數???? } if(event.getSource()== button[14])//當按下等號時,設置結果label的內容 { s += ”=“;jieguo.setText(s);num2 = Double.parseDouble(s2);switch(yunsuan){ case 1:
result = num1 + num2;
break;
case 2:
result = num1-num2;
break;
case 3:
result = num1 * num2;
break;
case 4:
if(s2.length()==1 && s2.charAt(0)=='0')//當初數為零時提示錯
jieguo2.setText(”0不能做除數“);
else
result = num1/num2;
break;}
jieguo.setText(s);//輸出算式
jieguo2.setText(df.format(result));//格式化輸出結果 }
if(event.getSource()== button[16])//將當前文本框內數據清除 { jieguo.setText(”“);jieguo2.setText(”“);s = ”“;s1 = ”“;s2 = ”“;yunsuan = 0;kong1 = 0;26
}
} } } import javax.swing.JFrame;public class TestCal { public static void main(String[] args){
Calculator calculator = new Calculator();
JFrame frame =new JFrame(”Calculator“);frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.getContentPane().add(calculator);frame.pack();frame.setVisible(true);
} } 源代碼四: 憤怒的小鳥 import java.awt.*;import java.awt.event.*;import javax.swing.*;
public class BirdPanel extends JPanel { private final int WIDTH = 1020, HEIGHT = 620;private final int DELAY = 90, IMAGE_SIZE = 40;private ImageIcon image,image2,image3;private Timer timer;private int x, y, moveX, moveY;//---// 設置面板,包括為了動畫引用計時器
//---public BirdPanel(){ timer = new Timer(DELAY, new AListener());
image = new ImageIcon(”鳥.png“);image2 = new ImageIcon(”目標.gif“);image3 = new ImageIcon(”birds1.jpg“);x = 0;y = 500;moveX = 30;27 moveY =-30;//豎直方向向上,做拋物線需要
setPreferredSize(new Dimension(WIDTH, HEIGHT));setBackground(Color.WHITE);
timer.start();} //---// 面板中顯示該有的圖片
//---public void paintComponent(Graphics page){ super.paintComponent(page);image3.paintIcon(this, page, 330, 0);image.paintIcon(this, page, x, y);image2.paintIcon(this, page, 900, 550);} //***************************************************************** // 定時器的操作監聽程序
//***************************************************************** private class AListener implements ActionListener { // // 更新圖像的位置和可能的運動方向每當計時器觸發操作事件 // // public void actionPerformed(ActionEvent event){ moveY +=2;//為了做拋物線每次少提高2個像素,最終才會下落 x += moveX;//以設定好的像素移動 y += moveY;
//判斷達到目標后停止,并產生相應的變化效果 if(x >= WIDTH-IMAGE_SIZE){ x = WIDTH-IMAGE_SIZE;} if(y >= HEIGHT-IMAGE_SIZE){ y= HEIGHT-IMAGE_SIZE;image2 = new ImageIcon(”變身.jpg“);image = new ImageIcon(”...“);//小鳥消失 } repaint();28 } } } //************************************************************* // Bird.java // // Angry birds!//************************************************************* import java.awt.*;import java.awt.event.*;import javax.swing.*;
public class Bird { public static void main(String[] args){ String x;x = ”開始 憤怒的小鳥游戲?“;JOptionPane.showMessageDialog(null,x);
JFrame frame = new JFrame(”Angry birds“);frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.getContentPane().add(new BirdPanel());frame.pack();frame.setVisible(true);} } 源代碼五: 剪刀石頭布 import java.awt.*;import java.awt.event.*;import java.util.Random;import javax.swing.*;import javax.swing.border.BevelBorder;
public class Fight extends JPanel { private JPanel panel1,panel2,panel3;private JLabel computer,bi,person;private ImageIcon ShiTouP,JianZiP,BuP,kong;private JButton shitouB,jianziB,buB;private Random generator;private int total = 0,c=0,p=0;public Fight(){
generator = new Random();//定義圖片
ShiTouP = new ImageIcon(”石頭.jpg“);JianZiP = new ImageIcon(”剪刀.jpg“);BuP = new ImageIcon(”布.jpg“);kong = new ImageIcon(”VS.jpg“);
//引用圖片給電腦和用戶
person = new JLabel(new ImageIcon(”客戶.gif“));bi = new JLabel(kong);computer =new JLabel(new ImageIcon(”電腦.jpg“));
panel1 = new JPanel();panel1.setBackground(Color.BLUE);panel1.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));panel1.setLayout(new BoxLayout(panel1,BoxLayout.X_AXIS));panel1.add(person);panel1.add(bi);panel1.add(computer);panel1.setPreferredSize(new Dimension(450,180));shitouB = new JButton(”石頭“);shitouB.addActionListener(new Mouse());jianziB = new JButton(”剪刀“);jianziB.addActionListener(new Mouse());
buB = new JButton(”布“);buB.addActionListener(new Mouse());panel2 = new JPanel();panel2.setLayout(new BoxLayout(panel2,BoxLayout.X_AXIS));panel2.add(jianziB);panel2.add(shitouB);panel2.add(buB);panel2.setPreferredSize(new Dimension(450,50));panel2.setBackground(new Color(200,218,235));
panel3 = new JPanel();panel3.setBackground(new Color(200,218,235));panel3.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));30 panel3.setLayout(new BoxLayout(panel3,BoxLayout.Y_AXIS));panel3.add(panel1);panel3.add(Box.createRigidArea(new Dimension(0,50)));panel3.add(panel2);
add(panel3);panel3.setPreferredSize(new Dimension(500,350));}
{ {
int ran = generator.nextInt(3);if(event.getSource()== jianziB){
person.setIcon(JianZiP);//當產生比較后根據結果變換圖片
if(ran == 0)
{
total += 1;
bi.setIcon(kong);
computer.setIcon(JianZiP);
}
if(ran == 1)
{
total += 1;
c += 1;
bi.setIcon(kong);
computer.setIcon(ShiTouP);
}
if(ran == 2)
{
total += 1;
p += 1;
bi.setIcon(kong);
computer.setIcon(BuP);
} } if(event.getSource()== shitouB){
person.setIcon(ShiTouP);
if(ran == 0)
{
private class Mouse implements ActionListener public void actionPerformed(ActionEvent event)
total += 1;
bi.setIcon(kong);
p += 1;
computer.setIcon(JianZiP);} if(ran == 1){
total += 1;
bi.setIcon(kong);
computer.setIcon(ShiTouP);} if(ran == 2){
total += 1;
c += 1;
bi.setIcon(kong);
computer.setIcon(BuP);} }
if(event.getSource()== buB){ person.setIcon(BuP);if(ran == 0){
total += 1;
bi.setIcon(kong);
c += 1;
computer.setIcon(JianZiP);} if(ran == 1){
total += 1;
bi.setIcon(kong);
p += 1;
computer.setIcon(ShiTouP);} if(ran == 2){
total += 1;
bi.setIcon(kong);
computer.setIcon(BuP);
}
}
if(event.getSource()== jianziB || event.getSource()== shitouB
|| event.getSource()== buB)
{
int again = JOptionPane.showConfirmDialog(panel2,”比賽進行了:“
+total+”次--您贏了“+p+”次--電腦贏了:“+c+”次 還要繼續玩嗎?“
,”提示“,JOptionPane.YES_NO_OPTION);
if(again==JOptionPane.NO_OPTION)
System.exit(0);
} }
}
} //********************************** // TestFight.java // //********************************** import javax.swing.JFrame;public class TestFight {
public static void main(String[] args){
Fight fight = new Fight();
JFrame frame =new JFrame(”石頭剪刀布“);frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.getContentPane().add(fight);frame.pack();frame.setVisible(true);} }
源代碼六:
//******************************************** // Student.java // 學生類,包括了各種屬性的設置和取值方法
//********************************************** public class Student 33 { int xuehao,keshi;String xingming,kemu,leixing,riqi;public Student(String xingming,int xuehao,String riqi,int keshi,String kemu,String leixing){ //構造函數
this.xingming=xingming;
this.xuehao=xuehao;
this.riqi=riqi;
this.kemu=kemu;
this.keshi=keshi;
this.leixing=leixing;} //各個屬性的get和set方法
public String getXingMing(){ return xingming;} public void setXingMing(String xingming){
this.xingming=xingming;} public int getXueHao(){ return xuehao;} public void setXueHao(int xuehao){
this.xuehao=xuehao;} public String getRiQi(){ return riqi;} public void setRiQi(String riqi){
this.riqi=riqi;} public int getKeShi(){
return keshi;} public void setKeShi(int keshi){ 34
this.keshi=keshi;} public String getKeMu(){ return kemu;} public void setKeMu(String kemu){
this.kemu=kemu;} public String getLeiXing(){ return leixing;} public void setLeiXing(String leixing){
this.leixing=leixing;} }
//************************************ // 運行類
//************************************
import java.awt.Dimension;import javax.swing.JFrame;
public class TestKaoQing { public static void main(String[] args){
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(new kaoqin());
frame.pack();
frame.setVisible(true);
} }
//****************************************** // kaoqin.java // 考勤類,定義了主要的面板和功能實現
//******************************************* import java.awt.*;import java.awt.event.*;import javax.swing.*;
import java.util.ArrayList;import javax.swing.border.BevelBorder;
public class kaoqin extends JPanel { JLabel jieguo;//統計功能的組件定義
JButton xAt,kAr;JTextArea JieGuo;JPanel jieguoP,panelB,account;
JLabel background1,background2,background3,background4;ArrayList
JTextField xingming11,xuehao11,riqi11,keshi11,kemu11,leixing11;String xingming111,xuehao111,riqi111,keshi111,kemu111,leixing111;JPanel Input,panel11,panel12,panel13,panel14,panel15,panel16;
JLabel xingming2,xuehao2,riqi2,keshi2,kemu2,leixing2;//修改功能組件的定義
JTextField xingming22,xuehao22,riqi22,keshi22,kemu22,leixing22;String xingming222,xuehao222,riqi222,keshi222,kemu222,leixing222;JPanel Modify,panel21,panel22,panel23,panel24,panel25,panel26,panel27;
JLabel xingming3,xuehao3,riqi3,keshi3,kemu3,leixing3;//查找功能組件的定義
JTextField xingming33,xuehao33,riqi33,keshi33,kemu33,leixing33;String xingming333,xuehao333,riqi333,keshi333,kemu333,leixing333;JPanel Find,panel31,panel32,panel33,panel34,panel35,panel36;
JButton tijiao1,xiugai2,chaxun2,chaxun3;//各個按鈕的定義
JTabbedPane tb;Integer cha1 = null,cha2 = null;public kaoqin(){
background1 = new JLabel(”請錄入學生信息!“);//提示信息的初始化
background2 = new JLabel(”請使用學號和姓名查詢!“);background3 = new JLabel(”請使用學號和姓名查詢!“);
student = new ArrayList
xingming1=new JLabel(”學生姓名:“);//錄入界面各個組件的安排
xuehao1=new JLabel(”學生學號:“);riqi1=new JLabel(”缺勤日期:“);keshi1=new JLabel(”缺勤課時:“);kemu1=new JLabel(”缺勤科目:“);leixing1=new JLabel(”缺勤類型:“);
xingming11=new JTextField(8);
xingming11.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
xuehao11=new JTextField(8);
xuehao11.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
riqi11=new JTextField(8);riqi11.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
keshi11=new JTextField(8);
keshi11.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
kemu11=new JTextField(8);kemu11.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
leixing11=new JTextField(8);
leixing11.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
panel11 = new JPanel();panel11.setBackground(new Color(230,239,255));panel11.setLayout(new BoxLayout(panel11,BoxLayout.X_AXIS));panel11.add(Box.createRigidArea(new Dimension(30,15)));panel11.add(xingming1);panel11.add(xingming11);
panel12 = new JPanel();panel12.setBackground(new Color(230,239,255));panel12.setLayout(new BoxLayout(panel12,BoxLayout.X_AXIS));panel12.add(Box.createRigidArea(new Dimension(30,0)));panel12.add(xuehao1);panel12.add(xuehao11);
panel13 = new JPanel();panel13.setBackground(new Color(230,239,255));panel13.setLayout(new BoxLayout(panel13,BoxLayout.X_AXIS));panel13.add(Box.createRigidArea(new Dimension(30,0)));panel13.add(riqi1);panel13.add(riqi11);
panel14 = new JPanel();panel14.setBackground(new Color(230,239,255));panel14.setLayout(new BoxLayout(panel14,BoxLayout.X_AXIS));panel14.add(Box.createRigidArea(new Dimension(30,0)));panel14.add(keshi1);panel14.add(keshi11);
panel15 = new JPanel();panel15.setBackground(new Color(230,239,255));panel15.setLayout(new BoxLayout(panel15,BoxLayout.X_AXIS));panel15.add(Box.createRigidArea(new Dimension(30,0)));panel15.add(kemu1);panel15.add(kemu11);
panel16 = new JPanel();panel16.setBackground(new Color(230,239,255));panel16.setLayout(new BoxLayout(panel16,BoxLayout.X_AXIS));panel16.add(Box.createRigidArea(new Dimension(30,0)));panel16.add(leixing1);panel16.add(leixing11);
tijiao1 = new JButton(”提交“);tijiao1.setFont(new Font(”幼圓“, Font.BOLD, 18));tijiao1.setPreferredSize(new Dimension(50,20));tijiao1.setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED));tijiao1.addActionListener(new ButtonListener());
Input=new JPanel();Input.setBackground(new Color(230,239,255));Input.setLayout(new BoxLayout(Input,BoxLayout.Y_AXIS));Input.add(Box.createRigidArea(new Dimension(30,0)));Input.add(background1);Input.add(Box.createRigidArea(new Dimension(0,10)));Input.add(panel11);//將各個panel添加到Input中
Input.add(panel12);Input.add(panel13);Input.add(panel14);Input.add(panel15);Input.add(panel16);Input.add(Box.createRigidArea(new Dimension(0,10)));Input.add(tijiao1);// 按鍵的添加
xingming2=new JLabel(”學生姓名:“);//修改界面各個組件的安排
xuehao2=new JLabel(”學生學號:“);riqi2=new JLabel(”缺勤日期:“);keshi2=new JLabel(”缺勤課時:“);kemu2=new JLabel(”缺勤科目:“);leixing2=new JLabel(”缺勤類型:“);xingming22=new JTextField(8);
xingming22.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
xuehao22=new JTextField(8);
xuehao22.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
riqi22=new JTextField(8);riqi22.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
keshi22=new JTextField(8);
keshi22.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
kemu22=new JTextField(8);kemu22.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
leixing22=new JTextField(8);
leixing22.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
panel21 = new JPanel();panel21.setBackground(new Color(230,239,255));panel21.setLayout(new BoxLayout(panel21,BoxLayout.X_AXIS));panel21.add(Box.createRigidArea(new Dimension(30,15)));panel21.add(xingming2);panel21.add(xingming22);
panel22 = new JPanel();panel22.setBackground(new Color(230,239,255));panel22.setLayout(new BoxLayout(panel22,BoxLayout.X_AXIS));panel22.add(Box.createRigidArea(new Dimension(30,0)));panel22.add(xuehao2);panel22.add(xuehao22);
panel23 = new JPanel();panel23.setBackground(new Color(230,239,255));panel23.setLayout(new BoxLayout(panel23,BoxLayout.X_AXIS));panel23.add(Box.createRigidArea(new Dimension(30,0)));panel23.add(riqi2);panel23.add(riqi22);
panel24 = new JPanel();panel24.setBackground(new Color(230,239,255));panel24.setLayout(new BoxLayout(panel24,BoxLayout.X_AXIS));panel24.add(Box.createRigidArea(new Dimension(30,0)));panel24.add(keshi2);panel24.add(keshi22);
panel25 = new JPanel();panel25.setBackground(new Color(230,239,255));panel25.setLayout(new BoxLayout(panel25,BoxLayout.X_AXIS));panel25.add(Box.createRigidArea(new Dimension(30,0)));panel25.add(kemu2);panel25.add(kemu22);
panel26 = new JPanel();panel26.setBackground(new Color(230,239,255));panel26.setLayout(new BoxLayout(panel26,BoxLayout.X_AXIS));panel26.add(Box.createRigidArea(new Dimension(30,0)));panel26.add(leixing2);panel26.add(leixing22);
xiugai2 = new JButton(”修改“);xiugai2.setFont(new Font(”幼圓“, Font.BOLD, 18));xiugai2.setPreferredSize(new Dimension(50,20));xiugai2.setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED));xiugai2.addActionListener(new ButtonListener());
chaxun2 = new JButton(”查詢“);chaxun2.setPreferredSize(new Dimension(50,20));chaxun2.setFont(new Font(”幼圓“, Font.BOLD, 18));chaxun2.setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED));chaxun2.addActionListener(new ButtonListener());
panel27 = new JPanel();panel27.setLayout(new BoxLayout(panel27,BoxLayout.X_AXIS));panel27.add(xiugai2);panel27.add(chaxun2);
Modify = new JPanel();Modify.setBackground(new Color(230,239,255));Modify.setLayout(new BoxLayout(Modify,BoxLayout.Y_AXIS));Modify.add(Box.createRigidArea(new Dimension(30,0)));Modify.add(background2);Modify.add(Box.createRigidArea(new Dimension(0,10)));Modify.add(panel21);Modify.add(panel22);Modify.add(panel23);Modify.add(panel24);Modify.add(panel25);Modify.add(panel26);Modify.add(Box.createRigidArea(new Dimension(0,10)));Modify.add(panel27);
xingming3=new JLabel(”學生姓名:“);//查找界面各個組件的安排
xuehao3=new JLabel(”學生學號:“);riqi3=new JLabel(”缺勤日期:“);keshi3=new JLabel(”缺勤課時:“);kemu3=new JLabel(”缺勤科目:“);leixing3=new JLabel(”缺勤類型:“);
xingming33=new JTextField(8);
xingming33.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
xuehao33=new JTextField(8);
xuehao33.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
riqi33=new JTextField(8);riqi33.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
keshi33=new JTextField(8);
keshi33.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
kemu33=new JTextField(8);kemu33.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
leixing33=new JTextField(8);
leixing33.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
panel31 = new JPanel();panel31.setBackground(new Color(230,239,255));panel31.setLayout(new BoxLayout(panel31,BoxLayout.X_AXIS));panel31.add(Box.createRigidArea(new Dimension(30,10)));panel31.add(xingming3);panel31.add(xingming33);
panel32 = new JPanel();panel32.setBackground(new Color(230,239,255));panel32.setLayout(new BoxLayout(panel32,BoxLayout.X_AXIS));panel32.add(Box.createRigidArea(new Dimension(30,0)));panel32.add(xuehao3);panel32.add(xuehao33);
panel33 = new JPanel();panel33.setBackground(new Color(230,239,255));panel33.setLayout(new BoxLayout(panel33,BoxLayout.X_AXIS));panel33.add(Box.createRigidArea(new Dimension(30,0)));panel33.add(riqi3);42
panel33.add(riqi33);
panel34 = new JPanel();panel34.setBackground(new Color(230,239,255));panel34.setLayout(new BoxLayout(panel34,BoxLayout.X_AXIS));panel34.add(Box.createRigidArea(new Dimension(30,0)));panel34.add(keshi3);panel34.add(keshi33);
panel35 = new JPanel();panel35.setBackground(new Color(230,239,255));panel35.setLayout(new BoxLayout(panel35,BoxLayout.X_AXIS));panel35.add(Box.createRigidArea(new Dimension(30,0)));panel35.add(kemu3);panel35.add(kemu33);
panel36 = new JPanel();panel36.setBackground(new Color(230,239,255));panel36.setLayout(new BoxLayout(panel36,BoxLayout.X_AXIS));panel36.add(Box.createRigidArea(new Dimension(30,0)));panel36.add(leixing3);panel36.add(leixing33);
chaxun3=new JButton(”查詢“);chaxun3.setPreferredSize(new Dimension(50,20));chaxun3.setFont(new Font(”幼圓“, Font.BOLD, 18));chaxun3.setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED));chaxun3.addActionListener(new ButtonListener());
Find = new JPanel();Find.setBackground(new Color(230,239,255));Find.setLayout(new BoxLayout(Find,BoxLayout.Y_AXIS));Find.add(Box.createRigidArea(new Dimension(30,5)));Find.add(background3);Find.add(Box.createRigidArea(new Dimension(0,10)));Find.add(panel31);Find.add(panel32);Find.add(panel33);Find.add(panel34);Find.add(panel35);43
Find.add(panel36);Find.add(Box.createRigidArea(new Dimension(0,10)));Find.add(chaxun3);
jieguo = new JLabel(”統計結果:“);//統計功能各個組件的安排 background4 = new JLabel(”統計“);xAt= new JButton(”學生和次數“);xAt.setPreferredSize(new Dimension(50,20));xAt.setFont(new Font(”幼圓“, Font.BOLD, 10));xAt.setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED));xAt.addActionListener(new ButtonListener());
kAr= new JButton(”課程和人數“);kAr.setPreferredSize(new Dimension(50,20));kAr.setFont(new Font(”幼圓“, Font.BOLD, 10));kAr.setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED));kAr.addActionListener(new ButtonListener());
JieGuo=new JTextArea();JieGuo.setBorder(BorderFactory.createBevelBorder(BevelBorder.LOWERED));
jieguoP = new JPanel();jieguoP.setBackground(new Color(230,239,255));jieguoP.setLayout(new BoxLayout(jieguoP,BoxLayout.X_AXIS));jieguoP.add(Box.createRigidArea(new Dimension(10,0)));jieguoP.setPreferredSize(new Dimension(40,20));jieguoP.add(jieguo);jieguoP.add(JieGuo);panelB= new JPanel();panelB.setBackground(new Color(230,239,255));panelB.setLayout(new BoxLayout(panelB,BoxLayout.X_AXIS));panelB.add(Box.createRigidArea(new Dimension(30,0)));panelB.add(xAt);panelB.add(kAr);44
account=new JPanel();
account.setBackground(new Color(230,239,255));
account.setLayout(new BoxLayout(account,BoxLayout.Y_AXIS));
account.add(Box.createRigidArea(new Dimension(30,5)));
account.add(background4);
account.add(Box.createRigidArea(new Dimension(0,10)));
account.add(jieguoP);
account.add(Box.createRigidArea(new Dimension(0,10)));
account.add(panelB);
tb = new JTabbedPane();tb.setBackground(new Color(230,239,255));tb.setBounds(0,0,400,400);
tb.setBorder(BorderFactory.createBevelBorder(BevelBorder.RAISED));
tb.addTab(”錄入“,Input);//將各個功能模塊加到tb中
tb.addTab(”修改“,Modify);tb.addTab(”查詢“,Find);tb.addTab(”統計“,account);setLayout(new BorderLayout());add(tb,BorderLayout.CENTER);
setSize(new Dimension(400,400));
}
private class ButtonListener implements ActionListener //監聽器類
{ public void actionPerformed(ActionEvent event){
xingming111=xingming11.getText();//錄入功能監聽
xuehao111=xuehao11.getText();
riqi111=riqi11.getText();
keshi111=keshi11.getText();
kemu111=kemu11.getText();
leixing111=leixing11.getText();if(event.getSource()== tijiao1)//判斷是否已經存在輸入的學生信息
{
for(int j = 0;j { 45 if(Integer.toString(student.get(j).getXueHao()).equals(xuehao111) || student.get(j).getXingMing().equals(xingming111)) { cha1=j; } } if(cha1 == null)//無此學生信息則錄入信息 { student.add(new Student(xingming111,Integer.parseInt(xuehao111),riqi111,Integer.parseInt(keshi111),kemu111,leixing111)); background1.setText(”錄入信息成功!“); xingming11.setText(null); xuehao11.setText(null); riqi11.setText(null); keshi11.setText(null); kemu11.setText(null); leixing11.setText(null); } else { background1.setText(”學生已有信息存在,有需要請修改!“); xingming11.setText(null); xuehao11.setText(null); riqi11.setText(null); keshi11.setText(null); kemu11.setText(null); leixing11.setText(null); } } if(event.getSource()==chaxun2)//修改功能監聽 { if(student.size()== 0) background2.setText(”暫無任何學生信息,請先錄入!“); else { for(int j = 0;j { xuehao222=xuehao22.getText(); xingming222=xingming22.getText(); if(Integer.toString(student.get(j).getXueHao()).equals(xuehao222) ||student.get(j).getXingMing().equals(xingming222)) { cha1 = j; } } if(cha1==null) { background2.setText(”無該學生信息,請重新查詢!“); xingming22.setText(”“); xuehao22.setText(”“); riqi22.setText(”“); keshi22.setText(”“); kemu22.setText(”“); leixing22.setText(”“); } } xingming22.setText(student.get(cha1).getXingMing());xuehao22.setText(Integer.toString(student.get(cha1).getXueHao()));riqi22.setText(student.get(cha1).getRiQi());keshi22.setText(Integer.toString(student.get(cha1).getKeShi()));kemu22.setText(student.get(cha1).getKeMu());leixing22.setText(student.get(cha1).getLeiXing());} if(event.getSource()== xiugai2)//當查到信息后開始修改 { student.remove(cha1); student.get(cha1).setKeMu(kemu22.getText()); student.get(cha1).setKeShi(Integer.parseInt(keshi22.getText())); student.get(cha1).setLeiXing(leixing22.getText()); student.get(cha1).setRiQi(riqi22.getText()); student.get(cha1).setXingMing(xingming22.getText()); student.get(cha1).setXueHao(Integer.parseInt(xuehao22.getText())); cha1 = null; xingming22.setText(null);//改后將文本框信息置空 xuehao22.setText(null); riqi22.setText(null); keshi22.setText(null); kemu22.setText(null); leixing22.setText(null); background2.setText(”修改成功!“); } if(event.getSource()== chaxun3)//查詢功能監聽 { if(student.size()== 0) background3.setText(”暫無任何學生信息,請先錄入!“); else { for(int j = 0;j { xuehao333=xuehao33.getText(); xingming333=xingming33.getText();// 通過比較輸入的學號或是姓名進行查詢 if(Integer.toString(student.get(j).getXueHao()).equals(xuehao333) || student.get(j).getXingMing().equals(xingming333)) { cha2 = j; } } if(cha2==null) { background3.setText(”無該學生信息,請重新查詢!“); xingming33.setText(”“); xuehao33.setText(”“); riqi33.setText(”“); keshi33.setText(”“); kemu33.setText(”“); leixing33.setText(”“); } } xingming33.setText(student.get(cha2).getXingMing());48 xuehao33.setText(Integer.toString(student.get(cha2).getXueHao())); riqi33.setText(student.get(cha2).getRiQi()); keshi33.setText(Integer.toString(student.get(cha2).getKeShi())); kemu33.setText(student.get(cha2).getKeMu()); leixing33.setText(student.get(cha2).getLeiXing()); background3.setText(”查詢成功!“); cha2 = null;} if(event.getSource()== xAt)//統計功能的監聽,按學生名和課時統計 { int sum=0; String str=”“; if(student.size()==0) background4.setText(”無任何學生信息!“); else for(int i=0;i { if(student.get(i).getKeShi()!=0) { sum += student.get(i).getKeShi();//統計學生缺勤總課時 str += student.get(i).xingming+”>“;//統計學生的名字 } JieGuo.setText(” 缺勤人:n“+str +”n總共缺勤 “+ sum+”次!“); // 輸出統計結果 } } if(event.getSource()== kAr)//按課程名和缺勤人數統計 { int sum2=0; String str2=”“; if(student.size()==0) background4.setText(”無任何學生信息!“); else for(int j=0;j { 49 if(student.get(j).getKeShi()!=0){ sum2 ++;str2 +=student.get(j).getKeMu()+”>“; } JieGuo.setText(” 有學生缺勤科目:n“+str2+”n缺勤人數為: "+sum2); } } } } } 1--計算器 Java實習報告 目錄 一、課程設計目的.................................................................................................................2 二、課程設計任務..................................................................................................................2 2.1、設計任務................................................................................................................2 2.2、課程設計要求:....................................................................................................2 2.3、需求分析................................................................................................................2 三、開發工具與平臺.............................................................................................................3 3.1、開發工具................................................................................................................3 3.2、開發平臺................................................................................................................3 四、設計思路..........................................................................................................................4 4.1、界面設計.................................................................................................................4 4.2.1、邏輯設計.............................................................................................................4 4.2.2、程序流程圖...........................................................................................................5 4.2.3、主要代碼展示及說明............................................................................................5 4.3、程序測試............................................................................................................10 五、實驗小結........................................................................................................................11 六、附錄(程序代碼)..........................................................................................................12 頁 第 1--計算器 Java實習報告 一、課程設計目的 1、熟練掌握java面向對象編程。 2、選擇合適的數據結構實現需求。 3、熟練使用各種控制結構。 4、GUI組件、事件處理技術。 二、課程設計任務 2.1、設計任務 設計一個簡易的計算器,可以進行四則運算:加、減、乘、除等(限于十進制下) 程序要求: (1)應具有相應的界面,可參考Windows操作系統自帶的計算器界面。(2)操作符號定為:“+”,“-”,“*”,“/”,“+/-”等。(按國際慣例設計)(3)用戶通過點擊程序界面上按鈕,實現數字、運算符的輸入操作。(4)以上部分為必須完成的內容。選作部分: (1)具有操作符號“1/x”,“sqrt”(開方),“.”(小數功能)等。 2.2、課程設計要求: (1)應用自己所學課程知識完成對計算器的基本任務。 (2)查閱相關資料,學習和掌握項目中涉及的新知識,提高自學能力。 (3)通過應用java程序編寫計算器來提升自己對簡單的圖形界面有一定的掌握和了解。 2.3、需求分析 1.設計的計算器可以完成加法、減法、乘法、除法的簡單運算。2.實現一些簡單的擴展運算,如:正負號、倒數、退格、清零等功能。 頁 第 2--計算器 Java實習報告3.添加小數點功能,用以實現浮點型數據的計算。 4.使用布局管理器設計一個計算器的界面,使用事件監聽器處理數據的輸入,并完成相關的計算。 三、開發工具與平臺 3.1、開發工具 Microsoft Windows 7旗艦版 3.2、開發平臺 JDK1.6.0-02 和UE編譯器 頁 第 3--計算器 Java實習報告 四、設計思路 4.1、界面設計:(如圖3-1) 圖3-1 4.2.1、邏輯設計: (1)根據所設計出來的界面,首先要設計其GUI界面,總體界面有一個文本框,20個按鈕,總體界面用BorderLayout布局,文本框放置在最NORTH,然后0到9以及+,-,*,/等按鈕放置到一個面板Panel中,完成界面設計。 (2)設計計算流程,首先點擊數字按鈕時,將按鈕數值添加到文本框當中,并將該數值保存到一個字符串中,再次點擊數字按鈕時,將之前保存的字符串與新的數值拼接起來,再添加到文本框當中,直到點擊運算符按鈕時,將文本框當中的字符串保存在一個字符串變量中,然后重置文本框內容,將運算符號顯示到文本框中,隨后輸入第二個計算數據時,用同樣的辦法保存數據,最后通過控制“=”運算符先將字符串數據轉化成雙精度類型,然后計算出結果并顯示到文本框當中。 (3)基本運算設計完成以后則開始考慮其他個別功能的實現,例如倒數、清零、退格等功能的實現,清零直接重置文本框內容,退格功能則采用substring函數截取字符串長度。 頁 第 4--計算器 Java實習報告 4.2.2、程序流程圖: 4.2.3、主要代碼展示及說明: 總體代碼的設計: 程序采用繼承windowadapter類,新建Jframe窗體,利用數組來定義JBotton按鈕,同時利用數組注冊監聽,采用4行5列網格布局,完成計算器界面的基本設置,在窗體的正常關閉方面,采用匿名類實現窗體的正常關閉。最后對按鈕進行計算分析,分別設定輸入數據的A類、運算符控制的Opertion類,退格功能的BackSpace類、計算結果的Result類等等,一步步實現計算器的基本功能! (1)類A的設計(數據的輸入) class A implements ActionListener { public void actionPerformed(ActionEvent e){ String a = Jtext.getText(); String s = e.getActionCommand(); if(a.equals(“0.”)||a.equals(“+”)||a.equals(“-”)||a.equals(“*”)||a.equals(“/”)) 頁 第 5--計算器 Java實習報告 } } Jtext.setText(s);else { if(flag2){ Jtext.setText(s); flag2=false;} else Jtext.setText(a+s);} 功能解釋:程序開始時,程序初始化文本框的內容為“0.”,點擊數字按鈕,則調用類A,首先用a來獲取當前文本框內容,s來獲取按鈕數值,然后進行判斷,若a的值為上述代碼的值則輸出s的值,再次點擊數字按鈕時,再次調用A類,此時a的值為上次輸入的s值,第一個if語句不滿足,執行下個if語句if(flag2),flag2初始值為false,該語句的功能是在執行了“=”號按鈕時,防止新的數字按鈕的值合并到到已經得出的結果上,例如:12+12=24,此時再點擊數字按鈕3時,則文本框內容被重置,輸出數值3,而不是243,如果if(flag2)不滿足,則將字符串a和s合并并輸出,得出第一個要計算的數據。 (2)類Opertion的設計:(運算符的控制) class Opertion implements ActionListener { public void actionPerformed(ActionEvent e){ cal=e.getActionCommand(); if(flag1==true) x=Jtext.getText(); Jtext.setText(cal); flag1=false;} 頁 第 6--計算器 Java實習報告 } 功能解釋:當點擊運算符控制按鈕時,首先將運算符的數值賦值給cal(初值為空),緊接著進行判斷,flag1初值為ture,該類的作用為在點擊運算符按鈕時,將計算的第一個數據保存在x字符串變量當中,然后將文本框內容重置為點擊的運算符的數值,類的結尾將flag1賦值為false,防止再次點擊運算符按鈕時改變了x的值。 (附:此時文本框內容為運算符的值,輸入第二個計算數據時,點擊數字按鈕,則再次調用A類,此時滿足A類中第一個if語句,文本框內容被重置為數字按鈕的值,接下來與獲取第一個計算數據步驟一樣,直到點擊“=”號運算符為止?。?/p> (3)類Result的設計:(計算并輸出結果) class Result implements ActionListener //計算并顯示結果 { public void actionPerformed(ActionEvent e){ double num1; num1=Double.parseDouble(x); y=Jtext.getText(); double num2; num2=Double.parseDouble(y); double result=0; if(num2!=0) { if(cal.equals(“+”)) result=num1+num2; if(cal.equals(“-”)) result=num1-num2; if(cal.equals(“*”)) result=num1*num2; String s1=Double.toString(result); Jtext.setText(s1); } if(cal.equals(“/”)) 頁 第 7--計算器 Java實習報告 } { if(num2==0) Jtext.setText(“除數不能為0”); else { result=num1/num2; String s1=Double.toString(result); Jtext.setText(s1); } } flag1=true; flag2=true;} 功能解釋:首先定義兩個Double型num1,num2,將之前保存的第一個計算數據x強制轉換為Double型后賦值給num1,接著用字符串變量y來獲取當前文本框的內容,即第二個計算數據的值,同樣再將其強制轉換Double型后賦值給num2,然后進行運算符判斷,對cal的值進行比較,然后進行相應的計算,將計算的結果轉換成字符串后將其輸出到文本框中,在類的最后將flag1、flag2賦值為true,作用是將計算的結果當作第二次計算的數據進行再運算,即將結果重新賦值給x作為第一個計算數據?。ǜ剑涸诖祟愔羞€考慮了當除數為零的情況。) (4)類BackSpace的設計:(功能類—退格) class BackSpace implements ActionListener { public void actionPerformed(ActionEvent e){ String s = e.getActionCommand(); String s1 = Jtext.getText(); if(s.equals(“退格”)) s1=new String(s1.substring(0,s1.length()-1)); Jtext.setText(s1);} } 頁 第 8--計算器 Java實習報告 功能解釋:這是計算器附加功能的實現,這里只介紹退格功能,像正負號、求倒數、清零等功能相似,所以就不再一一介紹。首先獲取退格按鈕的命令值賦給s,然后獲取當前文本框的內容,即輸入的數據,將其賦給s1,接著進行判斷,利用substring函數將s1字符串截取為從第一個字符至倒數第二個字符為止的字符串并重新賦值給s1,再將其輸出到文本框,實現退格的功能。 第 9 頁 10--計算器 Java實習報告 4.3、程序測試 1.簡單的運算:(以加法為例:123+456) 分析:計算的結果為579.0,為雙精度型,計算的結果被設置在文本框的最右端,該計算器的一個特點是可直接在文本框中輸入數據以及進行更改。 2.倒數的運算:(以123為例) 分析:輸出的結果如圖所示,倒數功能實現,計算時,不僅是結果,輸入的數據同樣可以先實現倒數功能后再進行相應的計算,沒有影響! 3.退格的運算:(以123為例) 分析:輸出的結果如圖所示,本計算器退格鍵有一個特點是,就算是是計算后得出的結果也能實現退格,缺點是不能很好的處理小數點的問題,因為小數點也是字符串的一部分。 頁 第 10--計算器 Java實習報告 4.正負號的運算:(以123為例) 分析:輸出的結果如圖所示,正負號添加能夠很好的實現,但可以進行一些改進,比如在計算過程當中直接點擊負號運算符輸入負數進行計算! 5.總體分析: 該計算器基本運算沒有問題,清零、正負號、求倒數、退格功能都能很好的實現,總體能完成一個計算器的基本功能,但仍有許多地方需要改進,比如小數點的實現所存在的一些問題,雖然在基本的運算過程當中不會造成太大影響,但這依然不能認為是一個很好的計算器,同時,在另一方面,該計算器還沒能很好的實現連續計算的功能,必須每次按下等號按鈕計算出結果后才能用產生的結果接著進行下一次的計算,改進的方法是在運算符上同時注冊Result類,讓運算符同時擁有計算結果的功能。 五、實驗小結 本次課程設計到此算是告一段落了,經過這次的學習,我學到了很多東西,在此基礎上更加鞏固了自己對java的認識與了解。 在做本項目是時候,會遇到很多小問題,比如說,在整個運算過程中要如何確保輸入的計算數據哪個是第一個計算數據的,哪個是第二個計算 頁 第 11--計算器 Java實習報告數據的,同時也要區分運算符,因為該計算器程序應用的都是利用字符串來完成計算的,而且不能重復輸出運算符,更不能將運算符錯誤的存儲在了第一個計算數據的數值中,也得考慮到萬一不小心重復點擊了運算符按鈕會不會造成第一個計算數據的重新賦值等等問題,最后想到利用布爾類型來很好的控制運算符的應用! 此次課程設計讓我更了解熟悉了Java中的圖形用戶界面和它的編程方式。在完成課題的過程中也不斷充實了自己,學習到了很多以前沒有學習到的知識,收獲很大。最大的收獲就是對大學學習的總結和培養了解決困難的信心和能力,使我對所學知識能夠融會貫通,又不斷豐富了新知識。Java計算器設計使得我們對所學的專業課有了更為深刻的認識,使得知識得到了鞏固和提高。 在接下來的時間里,我覺得我要更加努力的往深一層次的方面看齊,了解更多有關java的知識,對java有更深一步的了解,我會一步一步的走下去! 六、附錄(程序代碼)import java.awt.*;import javax.swing.*;import java.awt.event.*; public class TheCalculator extends WindowAdapter //程序框架繼承自WindowAdapter類 { private JTextField Jtext=new JTextField(“0.”);private JFrame f=new JFrame(“計算器-趙磊”);private String x=“";private String y=”“;private String cal=”“;private boolean flag1=true;private boolean flag2=false; public void init()//初始化 { String[] buttonValue = new String[]{”1“,”2“,”3“,”+“,”C“,”4“,”5“,”6“,”-“,”退格 頁 第 12--計算器 Java實習報告“,”7“,”8“,”9“,”*“,”1/x“,”0“,”+/-“,”.“,”/“,”=“}; Container contain = f.getContentPane(); JPanel Jpan = new JPanel(); JButton[] Jb=new JButton[20]; contain.setLayout(new BorderLayout());//采用4行5列的網格布局 Jpan.setLayout(new GridLayout(4,5)); Jtext.setHorizontalAlignment(JTextField.RIGHT); contain.add(Jtext,”North“); contain.add(Jpan); A num=new A();//數據 Result re=new Result();//結果 Opertion op=new Opertion();//運算符 Clear cl=new Clear();//清零 BackSpace back=new BackSpace();//退格 CountDown count_d=new CountDown();//倒數 Strains stra=new Strains();//相反數 for(int i = 0;i { Jb[i] = new JButton(buttonValue[i]); Jpan.add(Jb[i]); if(i==3 || i==8 || i==13 || i==18) Jb[i].addActionListener(op); if(i==0 || i==1 || i==2 || i==5 || i==6 || i==7|| i==10 || i==11 || i==12 || i==15 || i==17) Jb[i].addActionListener(num); if((i==3||i==4||i==8||i==9)||((i>12)&&(i<=19))&&i!=15) Jb[i].setForeground(new Color(255, 0, 0)); else Jb[i].setForeground(new Color(0, 0, 255));//控制按鈕字體顏色 } Jb[4].addActionListener(cl); Jb[9].addActionListener(back); Jb[14].addActionListener(count_d); Jb[16].addActionListener(stra); Jb[19].addActionListener(re); f.setSize(320,240); f.setVisible(true); f.addWindowListener(//采用匿名類實現窗口的正常關閉 new WindowAdapter() 頁 第 13--計算器 Java實習報告 { public void windowClosing(WindowEvent e) { System.exit(0); } });} class A implements ActionListener //輸入數據 { public void actionPerformed(ActionEvent e){ String a = Jtext.getText(); String s = e.getActionCommand(); if(a.equals(”0.“)||a.equals(”+“)||a.equals(”-“)||a.equals(”*“)||a.equals(”/“)) Jtext.setText(s); else { if(flag2) { Jtext.setText(s); flag2=false; } else Jtext.setText(a+s); } } } class Opertion implements ActionListener { public void actionPerformed(ActionEvent e){ cal=e.getActionCommand(); if(flag1==true) x=Jtext.getText(); Jtext.setText(cal); flag1=false;} } 頁 第 14--計算器 Java實習報告 class Clear implements ActionListener //清零功能 { public void actionPerformed(ActionEvent e){ Jtext.setText(”0.“);} } class CountDown implements ActionListener //求倒數類 { public void actionPerformed(ActionEvent e){ String s = e.getActionCommand(); String s1 = Jtext.getText(); if(s.equals(”1/x“)) s1 = new String(”“+1/Double.parseDouble(s1)); Jtext.setText(s1);} } class Strains implements ActionListener //求相反數類 { public void actionPerformed(ActionEvent e){ String s = e.getActionCommand(); String s1 = Jtext.getText(); if(s.equals(”+/-“)) s1=new String(”“+(0-Double.parseDouble(s1))); Jtext.setText(s1);} } class BackSpace implements ActionListener //退格功能 { public void actionPerformed(ActionEvent e){ String s = e.getActionCommand(); String s1 = Jtext.getText(); if(s.equals(”退格“)) s1=new String(s1.substring(0,s1.length()-1)); Jtext.setText(s1);} 頁 第 15--計算器 Java實習報告 } class Result implements ActionListener //計算并顯示結果 { public void actionPerformed(ActionEvent e){ double num1; num1=Double.parseDouble(x); y=Jtext.getText(); double num2; num2=Double.parseDouble(y); double result=0; if(num2!=0) { if(cal.equals(”+“)) result=num1+num2; if(cal.equals(”-“)) result=num1-num2; if(cal.equals(”*“)) result=num1*num2; String s1=Double.toString(result); Jtext.setText(s1); } if(cal.equals(”/“)) { if(num2==0) Jtext.setText(”除數不能為0"); else { result=num1/num2; String s1=Double.toString(result); Jtext.setText(s1); } } flag1=true; flag2=true;} } public static void main(String[] args)//main方法 { 頁 第 16--計算器 Java實習報告 } } TheCalculator count=new TheCalculator();count.init(); 頁 第 17第五篇:java課程設計報告—計算器