如何在java设计的程序中加入一个倒计时功能

如何在java设计的程序中加入一个倒计时功能,第1张

import java.awt.event.ActionEvent

import java.awt.event.ActionListener

import java.awt.event.KeyEvent

import java.awt.event.KeyListener

import java.util.Timer

import java.util.TimerTask

import javax.swing.JButton

import javax.swing.JFrame

import javax.swing.JLabel

import javax.swing.JTextField

public class TimeThreadFrame extends JFrame{

// 定义组件

private JLabel lblTime

private JTextField txtInput

private JButton btnEnter

// 构造方法

public TimeThreadFrame(){

// 设置窗体的相关属性

super("TimerThread")

this.setSize(300,200)

this.setLayout(null)

this.setLocation(100,50)

// 创建组件

this.lblTime = new JLabel("请输入倒计时时间")

this.lblTime.setBounds(30,20,200,30)

this.txtInput = new JTextField()

this.txtInput.setBounds(30,70,100,30)

this.btnEnter = new JButton("确定")

this.btnEnter.setBounds(150,70,70,30)

// 给JTextField注册监听

this.txtInput.addKeyListener(new KeyListener(){

public void keyPressed(KeyEvent ke) {

}

public void keyReleased(KeyEvent ke) {

}

public void keyTyped(KeyEvent ke) {

txtInput_KeyTyped(ke)

}

})

// 给JButton注册监听

this.btnEnter.addActionListener(new ActionListener(){

public void actionPerformed(ActionEvent ae){

btnEnter_ActionPerformed(ae)

}

})

// 将各组件添加到窗体上

add(lblTime)

add(txtInput)

add(btnEnter)

// 显示窗体

this.setVisible(true)

}

// 输入时的事件处理,控制用户只能输入数字

public void txtInput_KeyTyped(KeyEvent ke){

if(ke.getKeyChar() <'0' || ke.getKeyChar() >'9'){

ke.setKeyChar('\0')

}

}

// 点击按钮时的事件处理,核心!

public void btnEnter_ActionPerformed(ActionEvent ae){

// 获得用户输入的倒计时时间

String strTime = this.txtInput.getText()

if(strTime.equals("")){

// 检测用户是否输入

this.lblTime.setText("您尚未输入,请输入!")

}

else{

Integer time = Integer.parseInt(strTime)

// 创建线程

TimeThread tt = new TimeThread(this.lblTime,time)

tt.start()

// 创建Timer

Timer timer = new Timer()

timer.schedule(new TimerTask(){

// 启动其他程序

public void run() {

System.out.print("ok")

}

}, time * 1000)

}

}

// 启动窗体

public static void main(String[] args){

new TimeThreadFrame()

}

}

// 时间线程类

class TimeThread extends Thread{

private JLabel lblTime

private int time

// 构造方法传入,显示事件的JLabel和倒计时的时间。

public TimeThread(JLabel lblTime, int time){

this.lblTime = lblTime

this.time = time

}

// run方法

public void run(){

while(time >0){

// 显示所剩时间

this.lblTime.setText("所剩时间:" + time)

// 所剩时间减少

time--

try {

this.sleep(1000)

} catch (InterruptedException e) {

e.printStackTrace()

}

}

}

}

import java.awt.BorderLayoutimport java.awt.Containerimport java.awt.Fontimport java.awt.GridLayoutimport java.awt.event.ActionEventimport java.awt.event.ActionListenerimport javax.swing.JButtonimport javax.swing.JFrameimport javax.swing.JOptionPaneimport javax.swing.JPanelimport javax.swing.JTextFieldpublic class TimerDemo extends JFrame implements ActionListener {private static final long serialVersionUID = 201306211111L private JTextField screen = new JTextField("0") private JButton start = new JButton("开始") private JButton reset = new JButton("重置") private JPanel panel = new JPanel() private boolean isRunning private int time private int timeBetween public TimerDemo(int timeBetween) {super("计时器") this.timeBetween = timeBetween try {init() } catch (Exception e) {e.printStackTrace() }}public TimerDemo() {super("计时器") this.timeBetween = 100 try {init() } catch (Exception e) {e.printStackTrace() }}private void init() {panel.setLayout(new GridLayout()) panel.add(start) panel.add(reset) start.addActionListener(this) reset.addActionListener(this) screen.setFont(new Font("幼圆", Font.BOLD, 60)) screen.setHorizontalAlignment(JTextField.CENTER) screen.setEditable(false) Container c = getContentPane() c.setLayout(new BorderLayout()) c.add(panel, BorderLayout.SOUTH) c.add(screen, BorderLayout.CENTER) this.setSize(200, 150) this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE) this.setResizable(false) this.setLocationRelativeTo(null) this.setVisible(true) }public static void main(String[] args) {new TimerDemo(1)// 设定 1ms/次// new TimerDemo() }@Overridepublic void actionPerformed(ActionEvent e) {if (e.getSource() == start) {if (start.getText().equals("开始")) {start.setText("暂停") isRunning = true } else if (start.getText().equals("暂停")) {start.setText("开始") isRunning = false }}if (e.getSource() == reset) {start.setText("开始") screen.setText("0") isRunning = false time = 0 }new Thread(new TimeZone()).start() }class TimeZone implements Runnable {@Overridepublic void run() {while (isRunning) {time++ if (time >= Integer.MAX_VALUE) {screen.setText("ERROR") JOptionPane.showMessageDialog(null, "ERROR") isRunning = false }screen.setText(String.valueOf(time)) try {Thread.sleep(timeBetween) } catch (Exception e) {e.printStackTrace() }}}}}

计时器可以使用timer类也可以使用线程类来 *** 作,下面是Thread做的简单的计时器

public class Calculagraph extends Thread {

public static void main(String[] args) {

new Calculagraph().start()

}

private long now = 0l

private long start = System.currentTimeMillis()// 程序启动时间的毫秒值

private long time

public void run() {

while (true) {

now = System.currentTimeMillis()// 获取一秒之后的毫秒值

time = now - start// 两个时间相减的到毫秒差

System.out.format("%02d:%02d:%02d\n",

time / (1000 * 60 * 60) % 60/* 时 */, 

time / (1000 * 60)% 60/* 分 */, 

time / 1000 % 60/* 秒 */)// 格式化字符串输出

try {

Thread.sleep(1000)

} catch (InterruptedException e) {

e.printStackTrace()

}

}

}

}


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/bake/11844381.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-19
下一篇 2023-05-19

发表评论

登录后才能评论

评论列表(0条)

保存