秒表计时器——Java基础练手项目(Java课程设计)
前言:鄙人是大二在讀學生,大二上學期Java課程設計選了一個秒表計時器的題目,在此把代碼和心得分享出來(懶人可以直接看PPT)。鄙人資歷尚淺,代碼中會有許多不當之處,望各位大佬海涵,有更好的建議希望各位大佬留言評論區。
題目要求
設計一個與手機秒表類似的計時器,以鐘表圖形的方式呈現。
設計思路
- ? 首先利用java中的swing創建窗口,及其相關的組件,構造出大概的圖像,如下圖
- 然后利用java中的計時器類(Timer),讓指針隨著時間轉動(本來有視頻演示的,但是奈何視頻鄙人還不會插入……)
- 接著聲明一些變量(例如haveStart,isStop,number)來幫助判斷秒表的狀態(如下圖)
- 結合靜態變量,給三個按鈕添加事件監聽(jp_*為第*個按鈕)
//手動換行分開三個按鈕(手動滑稽)
//手動換行分開三個按鈕(手動滑稽)
- 使用jdbc技術連接java程序和mysql數據庫(這個題目里面是沒有要求的,但是想著完美一點就加上去了,下面3張圖為代碼演示和結果演示)
//手動換行分開圖片(手動滑稽)
//手動換行分開圖片(手動滑稽),下面這張圖是數據庫存儲后的結果,為了方便展示直接使用了數據庫管理系統的可視化工具navicat
程序分析
程序能夠符合題目的所有要求,并且結合實際考慮,在題目要求之外添加了如下幾個功能:
程序的不足之處:
心得與體會
在這個課程設計中遇到的難題及其解決方案:
1. 導包錯誤
這個課程設計中使用到了java中的計時器類(Timer),但是由于之前沒有接觸過這個類,所以是通過一些視頻,及百度才知道了這個類,使用這個類是需要導包的,但是不止一個包含有這個類,當時我下意識的導了java.swing這個包,因為這個課程設計很多都用到了swing,導致程序報錯(見下圖),但是明明我和百度和視頻上的幾乎一模一樣,在漫長的折磨下,我才想到可能是導錯包了。
解決方案:在java的API文檔和百度搜索上比較詳細的了解了這個類在不同包下的使用之后,挑選了一個比較合適的包導入,并且修改java語句,嘗試完成自己讓指針轉動的需求
2.版本不匹配問題 ?
我在電腦上配置的mysql的版本是5.7.36,然后用到的jdbc的jar是最新的8.0.27版本的,所以在起初看視頻學習jdbc技術時,敲著一模一樣的代碼,但是我這里會報錯(見下圖),這就讓人十分苦惱,難以繼續學習下去? ??
?
解決方案:在官網上找到對應版本的jdbc的jar文件(即5.7.36版本的jdbc的jar文件),然后把這個文件配置到運行環境中
幾個有用的網址:
1. Overview - Java 11中文版 - API參考文檔
Java中文在線幫助文檔
2.https://mvnrepository.com/artifact/mysql/mysqlconnector-java
可以很容易獲取Jdbc中任意版本的jar包
3. 百度一下,你就知道
可以解答我們目前為止在編程上遇到的90%的問題
源碼
package Miaobiao;import javax.swing.*; import java.awt.event.*; import java.sql.*; import java.text.SimpleDateFormat; import java.awt.*; import java.util.*; import java.util.Date; import java.util.Timer;public class MiaoBiao {//獲得記錄的時間SimpleDateFormat formatter= new SimpleDateFormat("yyyy-MM-dd 'at' HH:mm:ss ");Date date = new Date(System.currentTimeMillis());String s;// 創造各個組件final static double pai = 3.14159;JFrame jf = new JFrame("秒表窗口");JPanel jp_one = new JPanel();JPanel jp_two = new JPanel();JPanel jp_three = new JPanel();static int location_x = 0;static int location_y = 110;static MyCanvas myCanvas = new MyCanvas();JButton jb_one = new JButton("開始");JButton jb_two = new JButton("暫停");JButton jb_three = new JButton("復位");// 未開始時點擊復位彈出的對話框JDialog jd = new JDialog(jf, true);JTextArea jta = new JTextArea("程序未開始,此按鈕不可選!");static JTextField tf = new JTextField(10);JTextArea ta = new JTextArea(30, 10);// 設置一個變量來觀察秒表是否暫停static boolean isStop = true;// 設置一個變量記錄時間static private int t = 0;// 設置一個變量是否開始static boolean haveStart = false;// 設置一個變量記錄秒表運行次數static int number = 0;private static class MyTimer extends TimerTask {@Overridepublic void run() {if (isStop) {} else {//更新指針終點的x,y坐標,并且更新單行文本域的內容t++;location_x = (int) (Math.cos((pai / 2 - t * pai / 30)) * 110);location_y = (int) (Math.sin((pai / 2 - t * pai / 30)) * 110);tf.setText("" + t + "秒");myCanvas.repaint();}// TODO Auto-generated method stub}}/* void Jdbc() throws SQLException{ Driver driver =new com.mysql.jdbc.Driver();String url="jdbc:mysql://localhost:3306/miaobiao";Properties info =new Properties();info.setProperty("user", "root");info.setProperty("password", "root");Connection conn=driver.connect(url, info);String sql="insert into record(number,time,date) values(?,?,?)";PreparedStatement ps=conn.prepareStatement(sql);ps.setInt(1, number);ps.setString(2, t+"秒");ps.setString(3,s);ps.execute();ps.close();conn.close();}*/// 組裝函數public void init() {// 設置彈窗內容jd.setBounds(300, 300, 300, 200);jd.setTitle("錯誤!");jd.add(jta);// jd.setTe// 給復位按鈕設置成灰色jb_two.setBackground(Color.gray);jb_three.setBackground(Color.gray);// 給按鈕添加事件監聽jb_one.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {if (jb_two.getActionCommand().equals("暫停")) {isStop = false;haveStart = true;jb_two.setBackground(new Color(236, 242, 248));jb_three.setBackground(new Color(236, 242, 248));}}});jb_two.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {// 判斷這個按鈕當前的狀態if (!haveStart && e.getActionCommand().equals("暫停")) {jd.setVisible(true);} else if (haveStart && e.getActionCommand().equals("暫停")) {isStop = true;jb_two.setText("繼續");} else {isStop = false;jb_two.setText("暫停");}}});jb_three.addActionListener(new ActionListener() {public void actionPerformed(ActionEvent e) {if (haveStart) {// 更新成員變量的屬性值isStop = true;haveStart = false;location_x = 0;location_y = 110;jb_two.setText("暫停");// 在右邊的文本域中更新內容ta.append("第" + (++number )+ "次:" + t + "秒" + "\n");//寫入數據庫/* try {date = new Date(System.currentTimeMillis());s=formatter.format(date);Jdbc();} catch (SQLException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}*/t = 0;tf.setText("");// 給兩個按鈕回復顏色jb_three.setBackground(Color.gray);jb_two.setBackground(Color.gray);myCanvas.repaint();} else {jd.setVisible(true);}}});// 給三個面板添加組件myCanvas.setSize(new Dimension(360, 360));//myCanvas.setBackground(Color.blue);jp_one.add(myCanvas);jp_one.add(tf);jp_two.add(jb_one);jp_two.add(jb_two);jp_two.add(jb_three);jp_three.add(ta);// 給窗口添加三個面板jf.add(jp_one, BorderLayout.CENTER);jf.add(jp_two, BorderLayout.SOUTH);jf.add(jp_three, BorderLayout.EAST);// 設置窗口位置,大小,可見性,添加窗口關閉監聽jf.setBounds(200, 200, 500, 500);jf.setVisible(true);//jf.addWindowListener(new MyListener());jf.setDefaultCloseOperation(1);Timer timer = new Timer();timer.schedule(new MyTimer(), 0, 1000);}public static void main(String[] args) {new MiaoBiao().init();}// 創建畫布private static class MyCanvas extends Canvas {@Overridepublic void paint(Graphics g) {// 繪制鐘表圖g.drawOval(60, 40, 250, 250);g.setFont((new Font("Times", Font.BOLD, 30)));g.drawString("12", 170, 65);g.drawString("3", 290, 175);g.drawString("6", 178, 288);g.drawString("9", 62, 175);g.drawString("1", 235, 80);g.drawString("2", 275, 120);g.drawString("4", 275, 235);g.drawString("5", 235, 275);g.drawString("7", 126, 275);g.drawString("8", 80, 235);g.drawString("10", 75, 120);g.drawString("11", 115, 80);// 繪制指針,利用計時器更新 a b 的值使指針不停的轉動int a = 185 + location_x;int b = 165 - location_y;g.drawLine(185, 165, a, b);}} }注:為了讓代碼能夠成功運行,有關數據庫部分的代碼被注釋了。(注釋掉的部分:第67-83行,第133-140行)
另附本人的實驗報告文檔與分享會的PPT:
鏈接:https://pan.baidu.com/s/17FUTWmdxrha2Lpy8aARPyQ?
提取碼:zlry
好了~第一篇博客到此就結束了,大家對這個課程設計有什么問題可以在評論區留言~也歡迎各位大佬提出寶貴的修改意見~
總結
以上是生活随笔為你收集整理的秒表计时器——Java基础练手项目(Java课程设计)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 做了一个仿吃鸡游戏,可多人联网,算是学习
- 下一篇: 零空间维数的几何意义