JAVA課程項目報告
題目:利用java實作一個時鐘的小程式
姓名:王國梁
班級:計科13-2
學号:201303011200
利用JAVA實作一個時鐘的小程式
1. 軟體開發的需求分析
在當今的資訊時代,時鐘已經成為人們生活中必不可少的應用工具 ,Java語言是當今流行的網絡程式設計語言,它具有面向對象、與平台無關、安全、多線程 等特點。使用Java語言不僅可以實作大型企業級的分布式應用系統,還能夠為小型的、嵌入 式裝置進行應用程式的開發。面向對象的開發方法是當今世界最流行的開發方法,它不僅具有更貼近自然的語義,而且有利于軟體的維護和繼承。為了進一步鞏固課堂上所學到的知識,深刻把握Java語言的重要概念及其面向對象的特性,鍛煉我們熟練的應用面向對象的思想和設計方法解決實際問題的能力,開設了Java程式設計課程設計。
此次課程設計的題目為簡單的小時鐘程式設計,通過做鞏固所學Java語言基本知識,增進Java語言編輯基本功,掌握JDK、JCreator等開發工具的運用,拓寬常用類庫的應用。使我們通過該教學環節與手段,把所學課程及相關知識加以融會貫通,全面掌握Java語言的程式設計思想及面向對象程式設計的方法,為今後從事實際工作打下堅實的基礎。
Github源碼位址:https://github.com/1733965469/test/blob/master/clock
2.具體實作
2.1設計思路
Java是一種簡單的,面向對象的,分布式的,解釋的,鍵壯的,安全的,結構中立的,可移植的,性能很優異的,多線程的,動态的語言。Java去掉了C++語言的許多功能,讓Java的語言功能很精煉,并增加了一些很有用的功能,如自動收集碎片。這将減少平常出錯的50%。而且,Java很小,整個解釋器隻需215K的RAM。
是以運用JAVA程式編寫小時鐘程式,實作簡單顯示時間的功能。本次課程設計做的是Java簡單小時鐘,它是圖形界面、線程、流與檔案等技術的綜合應用,其界面主要采用了java.awt包,javax.swing包等。 程式實作了小時鐘的基本功能。
2.2設計方法
在設計簡單小時鐘時,需要編寫5個Java源檔案:Server.java、Objecting.java、LogIn.java、ClientUser.java、Client.java。
小時鐘除了需要編寫的上述5個Java源檔案所給出的類外,還需要Java系統提供的一些重要的類,如JTextField、JTextArea和File類。
2.3 運作環境
JDK,JCreator
2.4 程式功能圖及程式相關說明
2.4.1 主功能框
圖1 程式基本框圖
表1 小時鐘基本功能表
序号 | 檔案名 | 主要功能 |
1 | ServerHost | 被伺服器調用 |
2 | Client | 顯示小時鐘 |
3 | ClientUser | 被用戶端調用 |
4 | LogIn | 注冊登陸 |
5 | Objecting | 連接配接小時鐘 |
6 | Server | 啟動小時鐘 |
2.4.2 程式分析
程式中引入的包:
package Clock
import java.awt.Clock
import java.awt.Graphics
import java.awt.event.WindowAdapter
import java.awt.event.WindowEvent
import java.util.Calendar
import java.util.GregorianCalendar
使用者自定義類:
類名:Clock
作用:定義小時鐘
繼承的父類:JFrame
public class clock extends JFrame{
定義的對象:
ClockPaint
size
Resizable
Location
Title
Visible
WindowListener,WindowClosing
主要成員方法:
public void center //定義小程式檢視器的位置
public void actionPerformed //定義處理異常機制
定義子類:ClockPaint
繼承的父類名:JPanel
繼承的接口名:Runnable
class ClockPaint extends JPanel implements Runnable
int h, m, s // 小時,分鐘,秒
public ClockPaint
this.x = x
this.y = y
this.r = r
s = now.get(Calendar.SECOND) * 6 // 獲得秒轉換成度數
m = now.get(Calendar.MINUTE) * 6 // 獲得分鐘
h = (now.get(Calendar.HOUR_OF_DAY) - 12) * 30+ now.get(Calendar.MINUTE) / 12 * 6 // 獲得小時
public void paint(Graphics g) // 清屏
super.paint(g)
g.setColor(Color.BLACK)
g.fillRect(0, 0, r * 3, r * 3) // 畫圓
g.setColor(Color.WHITE)
g.drawOval(x, y, r * 2, r * 2) // 秒針
g.setColor(Color.RED)
int x1 = (int) ((r - 10) * Math.sin(rad * s))
int y1 = (int) ((r - 10) * Math.cos(rad * s))
g.drawLine(x + r, y + r, x + r + x1, y + r - y1) // 分針
g.setColor(Color.BLUE)
x1 = (int) ((r - r / 2.5) * Math.sin(rad * m))
y1 = (int) ((r - r / 2.5) * Math.cos(rad * m))
g.drawLine(x + r, y + r, x + r + x1, y + r - y1) // 時針
g.setColor(Color.CYAN)
x1 = (int) ((r - r / 1.5) * Math.sin(rad * h))
y1 = (int) ((r - r / 1.5) * Math.cos(rad * h))
g.drawLine(x + r, y + r, x + r + x1, y + r - y1) // 數字
g.setColor(Color.YELLOW)
int d = 29
for (int i = 1; i <= 12; i++)
x1 = (int) ((r - 10) * Math.sin(rad * d))
y1 = (int) ((r - 10) * Math.cos(rad * d))
g.drawString(i + "", x + r + x1 - 4, x + r - y1 + 5)
d += 30 // 小點
d = 0;
for (int i = 0; i < 60; i++)
x1 = (int) ((r - 2) * Math.sin(rad * d))
y1 = (int) ((r - 2) * Math.cos(rad * d))
g.drawString(".", x + r + x1 - 1, x + r - y1 + 1)
d += 6 // 顯示時間
//Calendar now1 = new GregorianCalendar();
//g.drawString(now1.get(Calendar.HOUR_OF_DAY) + ":"
//+ now1.get(Calendar.MINUTE) + ":" + now1.get(Calendar.SECOND),
//0, 10);
public void run
捕獲異常
catch (Exception ex)
完成顯示實時資料
s += 6
if (s >= 360)
s = 0
m += 6
if (m == 72 || m == 144 || m == 216 || m == 288)
h += 6
if (m >= 360)
m = 0
h += 6;
if (h >= 360)
h = 0;
this.repaint();
3.設計結果與分析
将5個Java源檔案:Server.java、Objecting.java、LogIn.java、ClientUser.java、Client.java。分别編譯這5個Java源檔案,或運作“javac *.java”指令,編譯全部的源檔案,然後運作連接配接伺服器的主類,即運作Clock類。連接配接完畢後在運作注冊的主函數類,即運作LogIn類。
運作Clock.java,運作結果如下:
圖2檢視實時時間
4. 設計總結
4.1 遇到的問題和解決方法
在用JAVA編寫程式時,我遇到了很多困難,對很多的接口,類,方法都不是很熟悉,隻好采用檢視API文檔,一個一個進行對照學習,同時也上網檢視了有關小時鐘的相關描述,還向同學請教了,翻閱了相關的書籍。尤其是因為有些方法需要使用JDK1.6才行,是以在學校網絡機房一開始不能運作,在安裝了1.6版本後運作正常了。
4.2 設計心得
花費了近一個多星期的時間,查閱了許多相關的資料,終于把這個Java小時鐘,程式基本實作了該課程設計的基本要求。在設計的過程中了解到自己的知識還是比較有限,更肯定了自己在以後學習程式設計的道路上堅定不移的但由于隻學習了一個學期的JAVA語言,自己水準有限,使得程式還有不是很完善回顧起此次java,至今我仍感慨頗多,的确,從選題到定稿,從理論到實踐,在整整一星期的日子裡,可以說得是苦多于甜,但是可以學到很多很多的的東西,同時不僅可以鞏固了以前所學過的知識,而且學到了很多在書本上所沒有學到過的知識。通過這次課程設計使我懂得了理論與實際相結合是很重要的,隻有理論知識是遠遠不夠的,隻有把所學的理論知識與實踐相結合起來,從理論中得出結論,才能真正掌握這門技術,也提高了自己的獨立思考的能力。在設計的過程中遇到問題,可以說得上是困難重重,這畢竟第一次做的,難免會遇到過各種各樣的問題,同時在設計的過程中發現了自己的不足之處,對以前所學過的知識了解得不夠深刻,掌握得不夠牢固,通過這次課程設計之後,一定把以前所學過的知識重新溫故。
通過此次課程設計,将我本學期所學的JAVA知識得到鞏固和應用,在設計的過程中我遇到了很到問題,不過在老師和同學們的幫助和自己的思考下還是很好的完成了。這此課程設計還讓我懂得了寫程式不能閉門造車,要努力拓寬知識面,開闊視野,拓展思維。它還讓我學會了在網上查閱那些無限的資料。讓我不僅學會了書本上的知識,還讓自己能夠面對困難并且克服它。
5.主要代碼:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.Calendar;
import java.util.GregorianCalendar;
import javax.swing.JFrame;
import javax.swing.JPanel;
/**
* 時間類
* *
*/
public class Clock extends JFrame {
/**
*
*/
private static final long serialVersionUID = 1L;
public Clock() {
ClockPaint cp = new ClockPaint(20, 20, 70);
this.add(cp);
this.setSize(200, 200);
this.setResizable(false);
this.setLocation(260, 120);
this.setTitle("小時鐘");
this.setVisible(true);
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
public static void main(String[] s) {
new Clock();
}
}
class ClockPaint extends JPanel implements Runnable {
/**
int x, y, r;
int h, m, s;// 小時,分鐘,秒
double rad = Math.PI / 180;
public ClockPaint(int x, int y, int r) {
this.x = x;
this.y = y;
this.r = r;
Calendar now = new GregorianCalendar();
s = now.get(Calendar.SECOND) * 6;// 獲得秒轉換成度數
m = now.get(Calendar.MINUTE) * 6;// 獲得分鐘
h = (now.get(Calendar.HOUR_OF_DAY) - 12) * 30
+ now.get(Calendar.MINUTE) / 12 * 6;// 獲得小時
Thread t = new Thread(this);
t.start();
public void paint(Graphics g) {
// 清屏
super.paint(g);
g.setColor(Color.BLACK);
g.fillRect(0, 0, r * 3, r * 3);
// 畫圓
g.setColor(Color.WHITE);
g.drawOval(x, y, r * 2, r * 2);
// 秒針
g.setColor(Color.RED);
int x1 = (int) ((r - 10) * Math.sin(rad * s));
int y1 = (int) ((r - 10) * Math.cos(rad * s));
g.drawLine(x + r, y + r, x + r + x1, y + r - y1);
// 分針
g.setColor(Color.BLUE);
x1 = (int) ((r - r / 2.5) * Math.sin(rad * m));
y1 = (int) ((r - r / 2.5) * Math.cos(rad * m));
// 時針
g.setColor(Color.CYAN);
x1 = (int) ((r - r / 1.5) * Math.sin(rad * h));
y1 = (int) ((r - r / 1.5) * Math.cos(rad * h));
// 數字
g.setColor(Color.YELLOW);
int d = 29;
for (int i = 1; i <= 12; i++) {
x1 = (int) ((r - 10) * Math.sin(rad * d));
y1 = (int) ((r - 10) * Math.cos(rad * d));
g.drawString(i + "", x + r + x1 - 4, x + r - y1 + 5);
d += 30;
}
// 小點
d = 0;
for (int i = 0; i < 60; i++) {
x1 = (int) ((r - 2) * Math.sin(rad * d));
y1 = (int) ((r - 2) * Math.cos(rad * d));
g.drawString(".", x + r + x1 - 1, x + r - y1 + 1);
d += 6;
// 顯示時間
//Calendar now1 = new GregorianCalendar();
//+ now1.get(Calendar.MINUTE) + ":" + now1.get(Calendar.SECOND),
//0, 10);
public void run() {
while (true) {
try {
Thread.sleep(1000);
} catch (Exception ex) {
s += 6;
if (s >= 360) {
s = 0;
m += 6;
if (m == 72 || m == 144 || m == 216 || m == 288) {
h += 6;
}
if (m >= 360) {
m = 0;
if (h >= 360) {
h = 0;
this.repaint();
}