JAVA实现篮球计分计时器
完整项目已经放到github上,可以随意下载并直接运行,只求点个星github链接
做这个的目的是学校举行的篮球赛决赛要在室内打,需要在大屏幕上投出比分、时间,因为找不到免费的软件用就只好自己写一个勉强能用的,虽然这么说但自己的东西在这种场合上派上用场还是有点开心的
这个东西做起来还是比较简单的,只需要懂基本的图形化界面就能做出来
思路:
- 计分计时系统需要的东西:标题、两个队的名字、两个队的比分、比赛剩余的时间、24秒
- 实现这几个东西:一个记录得分和队名的类,一个记录比赛剩余时间的类、一个记录24秒的类,组合这几个东西的类
- 得分只需要用KeyListener监听键盘,通过按不同的键进行加分,可设置 +1、+2、+3的情况,为了以防万一多加分,可再设置一个-1的情况
- 计时只需要一个Timer类的对象每0.1秒或者1秒产生一次ActionEvent,然后将数字不断减少再用一个标签显示出来即可实现计时,在到时间后需要时间保持不变;计时需要实现暂停、继续、重新开始的功能,只需要KeyListener监听键盘实现即可,注意24秒的规则,在时间少于14秒时如果出现需要回表的情况要把剩余时间变为从14秒开始减少,时间大于14秒不用管;为了以防万一忘记停表,可在设置加1秒、加1分钟的情况
完整代码如下:
public class Tool {public static void main(String[] args) {BasketWindow a = new BasketWindow() ;}
}public class BasketWindow extends JFrame implements KeyListener, ActionListener{ //计分计时窗口Score score ; //得分TimeHalf countdown ; //半场倒计时JLabel titil ; //标题Time24 time ; //24秒String titils, team1Name, team2Name ; //标题、队伍名称File titilFile, team1File, team2File ; //存数据的文件JMenuBar menuBar ; //菜单栏JMenu menu ;JMenuItem titilName, team1Chage, team2Chage ;BasketWindow() {menuBar = new JMenuBar() ;menu = new JMenu("修改") ;titilName = new JMenuItem("标题") ;team1Chage = new JMenuItem("队伍1") ;team2Chage = new JMenuItem("队伍2") ;titilName.addActionListener(this);team1Chage.addActionListener(this);team2Chage.addActionListener(this);menu.add(titilName) ;menu.add(team1Chage) ;menu.add(team2Chage) ;menuBar.add(menu) ;setJMenuBar(menuBar) ;titilFile = new File("标题.txt") ;team1File = new File("队名1.txt") ;team2File = new File("队名2.txt") ;try { FileReader in1 = new FileReader(titilFile) ; BufferedReader in2 = new BufferedReader(in1) ;titils = in2.readLine() ;in1 = new FileReader(team1File) ; in2 = new BufferedReader(in1) ;team1Name = in2.readLine() ;in1 = new FileReader(team2File) ; in2 = new BufferedReader(in1) ;team2Name = in2.readLine() ;in2.close();in1.close();} catch (IOException e) {}titil=new JLabel(titils) ;score=new Score(team1Name, team2Name) ;countdown=new TimeHalf() ;time=new Time24() ;setLayout(null) ; //设置为null布局,自己控制各个组件的位置add(titil) ;titil.setBounds(150,10,1970,150) ;titil.setFont(new java.awt.Font("24",Font.BOLD,100)) ;titil.setForeground(Color.blue) ;add(score);score.setBounds(0, 150, 1970, 450);add(countdown);countdown.setBounds(0, 610, 1970, 310);add(time);time.setBounds(0,900,1970,150);addKeyListener(this);setFocusable(true); setVisible(true);validate();setBounds(0,0,1970,1090);setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);}public void keyTyped(KeyEvent e) {}public void keyPressed(KeyEvent e) {}public void keyReleased(KeyEvent e) {//队伍1计分if(e.getKeyCode()==KeyEvent.VK_Q) { //按Q加1score.count1+=1;score.score1.setText(""+score.count1);}else if(e.getKeyCode()==KeyEvent.VK_W) { //按W加2score.count1+=2;score.score1.setText(""+score.count1); }else if(e.getKeyCode()==KeyEvent.VK_E) { //按E加3score.count1+=3;score.score1.setText(""+score.count1); }else if(e.getKeyCode()==KeyEvent.VK_R) { //按R减1score.count1-=1;score.score1.setText(""+score.count1); }//队伍2计分else if(e.getKeyCode()==KeyEvent.VK_U) {score.count2+=1;score.score2.setText(""+score.count2); }else if(e.getKeyCode()==KeyEvent.VK_I) {score.count2+=2;score.score2.setText(""+score.count2); }else if(e.getKeyCode()==KeyEvent.VK_O) {score.count2+=3;score.score2.setText(""+score.count2); }else if(e.getKeyCode()==KeyEvent.VK_P) {score.count2-=1;score.score2.setText(""+score.count2); }//半场计时else if(e.getKeyCode()==KeyEvent.VK_F1) { //按F1开始比赛countdown.flag = true ; //控制是否播放提示音countdown.min=24;countdown.second=0;countdown.time.start();}else if(e.getKeyCode()==KeyEvent.VK_S) //按S暂停比赛countdown.time.stop();else if(e.getKeyCode()==KeyEvent.VK_L) //按L继续比赛countdown.time.restart();else if(e.getKeyCode()==KeyEvent.VK_F2) //按F2回一秒countdown.second+=1;else if(e.getKeyCode()==KeyEvent.VK_F3) //按F3回一分钟countdown.min+=1;else if(e.getKeyCode()==KeyEvent.VK_Z) { //24秒time.flag = true ;time.second1=23;time.second2=9;time.time.start();}else if(e.getKeyCode()==KeyEvent.VK_X) {time.time.stop();if(time.second1<14) {time.second1=13;time.second2=9;}}else if(e.getKeyCode()==KeyEvent.VK_C) time.time.restart();else if(e.getKeyCode()==KeyEvent.VK_V) {time.second1=13;time.second2=9;time.time.start();}}public void actionPerformed(ActionEvent z) { //控制菜单栏if(z.getSource() == titilName) {titils = JOptionPane.showInputDialog(null, "请输入要修改的标题", "修改标题", JOptionPane.INFORMATION_MESSAGE) ;if(titils != null) {try { FileWriter out1 = new FileWriter(titilFile) ; BufferedWriter out2 = new BufferedWriter(out1) ;out2.write(titils);out2.flush();out2.close();out1.close();titil.setText(titils);} catch (IOException e) {}}}if(z.getSource() == team1Chage) {team1Name = JOptionPane.showInputDialog(null, "请输入要修改的名字", "修改队伍1名字", JOptionPane.INFORMATION_MESSAGE) ;if(team1Name != null) {try { FileWriter out1 = new FileWriter(team1File) ; BufferedWriter out2 = new BufferedWriter(out1) ;out2.write(team1Name);out2.flush();out2.close();out1.close();score.team1.setText(team1Name);} catch (IOException e) {}}}if(z.getSource() == team2Chage) {team2Name = JOptionPane.showInputDialog(null, "请输入要修改的名字", "修改队伍2名字", JOptionPane.INFORMATION_MESSAGE) ;if(team2Name != null) {try { FileWriter out1 = new FileWriter(team2File) ; BufferedWriter out2 = new BufferedWriter(out1) ;out2.write(team2Name);out2.flush();out2.close();out1.close();score.team2.setText(team2Name);} catch (IOException e) {}}} }
}public class TimeHalf extends JPanel implements ActionListener { //记录半场时间JLabel show ; //显示时间Timer time ; //控制时间File sound ;URL url ;URI uri ;AudioClip clip ;int min = 24, second = 0 ;Boolean flag = true;TimeHalf() {setLayout(null) ; //设置为null布局,自己控制各个组件的位置time=new Timer(1000,this) ; //每1秒发生一次事件show=new JLabel("20:00") ;add(show) ;show.setForeground(Color.red) ; //设置字体颜色show.setBounds(650,0, 1970, 330) ;show.setFont(new java.awt.Font("24",20,250)) ; sound = new File("篮球提示音.wav") ;}public void actionPerformed(ActionEvent e) {if(e.getSource() == time) { //每过1秒产生一个新事件if(second==0 && min!=0) { //秒到0要重置 second = 59 ; min-- ; //分要减1}show.setText(min+":"+second);if(second==0 && min==0) { //时间到就一直显示0:0second = 0 ;min = 0 ;if(flag) {try {uri = sound.toURI() ;url = uri.toURL() ;clip = Applet.newAudioClip(url) ;clip.play() ;flag = false ;}catch(Exception a) {}} }else //每产生一次事件减1秒 second -= 1 ;}}
}public class Score extends JPanel { //计分JLabel team1, team2, score1, score2 ;int count1 = 0, count2 = 0 ;Score(String team1Name, String team2Name) {setLayout(null) ; //设置为null布局,自己控制各个组件的位置team1=new JLabel(team1Name) ;team2=new JLabel(team2Name) ;score1=new JLabel("0") ;score2=new JLabel("0") ;add(team1) ;team1.setBounds(90,50,985,150) ;team1.setFont(new java.awt.Font("24",20,90)) ;team1.setForeground(Color.blue) ;add(team2) ;team2.setBounds(1050,50,985,150) ;team2.setFont(new java.awt.Font("24",20,90)) ;team2.setForeground(Color.blue) ;add(score1) ;score1.setBounds(300,210,985,300) ;score1.setFont(new java.awt.Font("24",20,270)) ;score1.setForeground(Color.blue) ;add(score2) ;score2.setBounds(1260,210,985,300) ;score2.setForeground(Color.blue) ;score2.setFont(new java.awt.Font("24",20,270)) ;}
}public class Time24 extends JPanel implements ActionListener{ //记录24秒JLabel show ; //显示24秒Timer time ; //控制时间File sound ;URL url ;URI uri ;AudioClip clip ;int second1 = 23, second2 = 9 ; Boolean flag ;Time24() {setLayout(null) ; //设置为null布局,自己控制各个组件的位置time=new Timer(100,this) ; //每0.1秒发生一次事件show=new JLabel("24") ;add(show) ;show.setBounds(800, 10, 1970,130) ;show.setFont(new java.awt.Font("24",50,90)) ;sound = new File("篮球提示音.wav") ;}public void actionPerformed(ActionEvent e) {if(e.getSource()==time) { //每过0.1秒产生一个新事件if(second2==0 && second1!=0) { //毫秒到0要重置second2=9 ;second1-- ; //秒要减少1}show.setText(second1+"."+second2) ; if(second1 <= 0 && second2 ==0) { //24秒结束要重置 second1 = 0 ;second2 = 0 ;if(flag) {try {uri = sound.toURI() ;url = uri.toURL() ;clip = Applet.newAudioClip(url) ;clip.play() ;flag = false ;}catch(Exception a) {}} }second2-=0.1 ; //每一次事件要减0.1秒 }}
}
总结:
本来想做一个功能很完善的东西,可以随意改变队伍名称标题、多选颜色、自定义按键位置等等,但是做了一个改名称的功能之后就停下了,如果接着做下去有点费时间而且感觉进步不大基本都在做重复的事情,所以就放弃,如果以后有机会会把它完善的
在做这个东西之前我还没有开始学习图形化界面,但接到这个任务后也给了我动力去学,在学了两天基本操作后花了两个晚上做出来这个效果,所以还是要多逼自己一把
希望我的东西能对你们有启发,如果有想要借鉴的我很欢迎,但请私信和我说一声
JAVA实现篮球计分计时器相关推荐
- AT89C52实现篮球计分计时器,并通过proteus仿真
一.设计环境与器材 Keil开发uVision4开发环境,window10系统. 二.设计内容 a.设计内容分析: 1.能够记录整个赛程的比赛时间并可同时用数码管显示. 2.可通过键盘修改当前的比赛成 ...
- 基于51单片机篮球计分系统
目录 一.项目功能概述 二.仿真 三.程序 四.论文 五.资料清单 资料下载地址:基于51单片机篮球计分系统 一.项目功能概述 液晶显示比赛时间.甲队和乙队的得分: 甲 甲队和乙队的得分分别有加1分 ...
- 基于51单片机的篮球比赛计时器
目录 基于51单片机的篮球比赛计时器 1.PCB原理图 2.仿真图 3.毕设要求: 4.总体方案设计 5.程序源码 6.资源下载 基于51单片机的篮球比赛计时器 注:本毕设资源可在微信公众号:&quo ...
- 基于java(springboot)篮球竞赛预约管理系统(java毕业设计)
基于java(springboot)篮球竞赛预约管理系统 篮球竞赛管理系统是基于java编程语言,mysql数据库,springboot框架和idea工具开发,本系统分为用户和管理员两个角色,其中用户 ...
- java毕业设计-篮球资讯网站-源码+lw文档+mybatis+系统+mysql数据库+调试
java毕业设计-篮球资讯网站-源码+lw文档+mybatis+系统+mysql数据库+调试 java毕业设计-篮球资讯网站-源码+lw文档+mybatis+系统+mysql数据库+调试 本源码技术栈 ...
- Verilog——篮球24S计时器
篮球24S计时器 设计要求 24s倒计时 代码实现 设计模块 测试模块 仿真结果 显示 代码实现 设计模块 测试模块 仿真结果 设计要求 (1)具有显示24秒计时功能: (2)系统设置外部操作开关,控 ...
- 篮球比赛表式计时器_篮球比赛计时器.docx
成绩 成绩 课 程 设 计 说 明 书 课程设计名称: 电子技术课程设计 题 目: 篮球比赛计时器 学 院: 电气与电子信息学院 学 生 姓 名: 专 业: 电气工程及其自动化 学 号: 指 导 教 ...
- 【项目实训】篮球计分系统设计(无线nRF905版本)
将单片机项目实训--篮球计分系统(无线nRF905版本)分享出来,如有不足,敬请指出. [实验图片] [视频视频] [项目实训]篮球积分系统(nRF905版本) 目录 一.设计要求 二.方案设计 三. ...
- java编写篮球比赛计分,android 篮球比赛计分器
[实例简介] 篮球计时器的源码,其中有每节比赛时间设定,两队队员信息输入,两队分数设置,抢断,助攻,范规数量对比,可查询两队队员信息 [实例截图] [核心代码] bab97e0a-cfae-4a21- ...
最新文章
- 与table有关的布局
- llinux 调整swap方法
- 八大排序算法交换排序算法
- java 中的event_Java中this与event有什么不同
- [译]机器人操作系统简介:终极机器人应用框架(上)
- ios-UIViewController和魔态视图的应用以及设备支持方向的设置
- python迭代_Python迭代
- FileExplorer手机访问电脑文件
- php 自定义 base64 解码,php base64 编码与解码实例代码
- vscode实用快捷键_23个常用的VSCode快捷键(动图演示)
- 警告: A docBase E:/Tomcat/webapps/Test inside the host appBase has been specified, and will be ignored
- 电脑风扇转,屏幕、键盘和鼠标都不亮
- 开启mysql服务注意事项
- 小博的软件测试学习笔记(V1.0)
- android模拟win98中文版,Android模拟Win 98模拟器(Bochs)
- 基于java+springboot+mybatis+vue+elementui的古玩玉器交易系统
- 如何视频裁剪?建议收藏这几种裁剪视频的方法
- 科比投篮预测,可视化与探索性数据分析(二)
- java线下IT培训机构平台ssm培训课程成绩管理系统微信小程序源码和论文
- oracle 配置sde,配置多个Oracle实例的sde服务