日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > java >内容正文

java

秒表计时器——Java基础练手项目(Java课程设计)

發布時間:2023/12/8 java 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 秒表计时器——Java基础练手项目(Java课程设计) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言:鄙人是大二在讀學生,大二上學期Java課程設計選了一個秒表計時器的題目,在此把代碼和心得分享出來(懶人可以直接看PPT)。鄙人資歷尚淺,代碼中會有許多不當之處,望各位大佬海涵,有更好的建議希望各位大佬留言評論區。

題目要求

設計一個與手機秒表類似的計時器,以鐘表圖形的方式呈現。

  • 當用戶用鼠標單擊界面的“開始”按鈕或圖標時,秒表開始計時,表及數字都自動發生變化;當用戶再次點擊按鈕,秒表暫停計時,按鈕字樣變為“繼續”;當用戶用鼠標點擊“繼續”按鈕,秒表繼續計時。
  • 界面上還有一個“復位”按鈕,當未點擊“開始”按鈕,沒有進入計時狀態時,“復位”按鈕為灰色不可選,當開始計時后,“復位”按鈕變為可選狀態,當用戶點擊復位按鈕時,秒表計時清零。
  • 設計思路

    • ? 首先利用java中的swing創建窗口,及其相關的組件,構造出大概的圖像,如下圖
    • 然后利用java中的計時器類(Timer),讓指針隨著時間轉動(本來有視頻演示的,但是奈何視頻鄙人還不會插入……)
    • 接著聲明一些變量(例如haveStart,isStop,number)來幫助判斷秒表的狀態(如下圖)

    • 結合靜態變量,給三個按鈕添加事件監聽(jp_*為第*個按鈕)

    //手動換行分開三個按鈕(手動滑稽)

    //手動換行分開三個按鈕(手動滑稽)

    • 使用jdbc技術連接java程序和mysql數據庫(這個題目里面是沒有要求的,但是想著完美一點就加上去了,下面3張圖為代碼演示和結果演示)

    //手動換行分開圖片(手動滑稽)

    //手動換行分開圖片(手動滑稽),下面這張圖是數據庫存儲后的結果,為了方便展示直接使用了數據庫管理系統的可視化工具navicat

    程序分析

    程序能夠符合題目的所有要求,并且結合實際考慮,在題目要求之外添加了如下幾個功能:

  • 在未點擊開始按鈕時,暫停按鈕也設置成灰色不可點擊的狀態
  • 在未點擊開始前,點擊暫停或者復位按鈕的話,會有彈窗提醒,告訴使用者“程序未開始,此按鈕不可選!”
  • 在窗口右側添加了多行文本域,可以展示在一次使用中的多次記錄的次序和時長
  • 使用了JDBC技術連接了java程序和mysql數據庫,可以在點擊復位按鈕時自動把每次記錄的次序,時長,記錄的時間存入數據庫中,便于數據的保存和查詢。
  • 程序的不足之處:

  • 因為采用了Java Swing中的組件來構造鐘表,所以鐘表圖形簡陋,窗口上的單行文本域和多行文本域也顯得有些呆滯
  • 心得與體會

    在這個課程設計中遇到的難題及其解決方案:

    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课程设计)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。