java小程序:闹钟(倒计时)

本文介绍了一个使用Java Swing实现的简易闹钟应用程序的设计与实现过程。该应用通过图形界面允许用户设定闹钟时间,并采用定时任务来实现倒计时功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MainFrame.java
package ui;

import java.awt.Component;
import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Date;
import java.util.Formatter;
import java.util.Timer;
import java.util.TimerTask;

import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;

import act.OkActionThread;

public class MainFrame {
	private Date today;
	public static JLabel Label[];
	private GridBagLayout gridBag;
	private JFrame jfrmMain;
	private Container con;
	private JLabel intervalRadio;
	private JCheckBox chkBox;
	private JTextField minuteText;
	private JButton jbutOK, jbutCancel;
	private int minLeft = 0;
	private String msg[] = { "当前时间", "", "订于", "分钟后", "订于", "提醒", "现在还差", "0秒" };

	public static void main(String[] args) {
		new MainFrame();
	}

	public MainFrame() {
		initAlarmClock();

	}

	/* 设置字符串,元素为界面显示的组件名称 */

	/* 函数实现所有界面初始化 */
	private void initAlarmClock() {
		int i;
		today = new Date();
		jfrmMain = new JFrame("小闹钟");
		gridBag = new GridBagLayout();
		GridBagConstraints gridBagConstraints = new GridBagConstraints();
		gridBagConstraints.fill = GridBagConstraints.BOTH;// 在水平方向和垂直方向上同时调整组件大小。

		con = jfrmMain.getContentPane();
		con.setLayout(gridBag);
		jfrmMain.setSize(400, 400);

		// 标签导入
		Label = new JLabel[msg.length];
		for (i = 0; i < Label.length; i++)
			Label[i] = new JLabel(msg[i], JLabel.CENTER);

		// Label:“当前时间”
		gridBagConstraints.gridwidth = 1;// 指定组件显示区域的某一行中的单元格数
		gridBagConstraints.gridheight = 2;// 指定在组件显示区域的一列中的单元格数。
		gridBagConstraints.insets = new Insets(0, 0, 5, 0);// 此字段指定组件的外部填充,即组件与其显示区域边缘之间间距的最小量。
		addComponents(Label[0], gridBagConstraints);

		// Label:显示出当前时间
		gridBagConstraints.gridwidth = GridBagConstraints.REMAINDER;
		Label[1].setText(TimeToString(today));
		addComponents(Label[1], gridBagConstraints);

		// Label:间隔时间
		gridBagConstraints.gridwidth = 1;
		intervalRadio = new JLabel("间隔时间");
		addComponents(intervalRadio, gridBagConstraints);

		// Label:“订于”
		addComponents(Label[2], gridBagConstraints);

		// JTextField: minLeft
		minuteText = new JTextField("1", 6);
		minuteText.getDocument().addDocumentListener(new DocumentListener() {

			@Override
			public void removeUpdate(DocumentEvent documentevent) {
				System.out.println("Text Inserted:" + minuteText.getText());
			}

			@Override
			public void insertUpdate(DocumentEvent documentevent) {
				System.out.println("Text Inserted:" + minuteText.getText());
			}

			@Override
			public void changedUpdate(DocumentEvent documentevent) {
				System.out.println("Text Inserted:" + minuteText.getText());
			}
		});
		addComponents(minuteText, gridBagConstraints);

		// Label: “分钟后”
		gridBagConstraints.gridwidth = GridBagConstraints.REMAINDER;
		addComponents(Label[3], gridBagConstraints);

		// Label:“现在还差”
		gridBagConstraints.gridwidth = 1;
		addComponents(Label[6], gridBagConstraints);

		// Label:“0秒”
		gridBagConstraints.gridwidth = GridBagConstraints.REMAINDER;
		Label[7].setText(minLeft + "秒");
		addComponents(Label[7], gridBagConstraints);

		// JCheckBox :"蹦出来"
		gridBagConstraints.gridwidth = 1;
		chkBox = new JCheckBox("蹦出来", true);
		addComponents(chkBox, gridBagConstraints);

		// JPanel
		JPanel panel = new JPanel();
		panel.setLayout(new FlowLayout());

		// JButton jbutOK
		jbutOK = new JButton("确定");
		jbutOK.addActionListener(new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent arg0) {

				minLeft = 60 * Integer.parseInt(minuteText.getText());// 1min =
																		// 60s
				// 点击“确定”时,开始倒计时
				
//              // -------> 第一种:Timer方式 <--------  
//				 new Thread(new OkActionThread(minLeft)).start();

				// -------> 第二种:Timer方式 <--------
				
				final Timer timer=new Timer();
					timer.schedule(new TimerTask() {
						@Override
						public void run() {
							Label[7].setText(minLeft-- + "秒");
							if(minLeft==-1)
								timer.cancel();
						}

					}, 0, 1000);
				

				System.out.println("------" + Label[7].getText());
			}
		});

		// JButton jbutCancel
		jbutCancel = new JButton("取消");
		panel.add(jbutOK);
		panel.add(jbutCancel);
		gridBagConstraints.gridwidth = GridBagConstraints.REMAINDER;
		addComponents(panel, gridBagConstraints);

		jfrmMain.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		jfrmMain.setVisible(true);

	}

	/* 设置函数将目标组obj件加入容器c */
	private void addComponents(Component obj,
			GridBagConstraints gridBagConstraints) {
		gridBag.setConstraints(obj, gridBagConstraints);
		con.add(obj);
	}

	/* 函数实现将时间类型编程字符串类型 */
	private String TimeToString(Date day) {
		Formatter fmt = new Formatter();
		fmt.format("%tT", day);
		return fmt.toString();
	}

}


OkActionThread.java
package act;

import ui.MainFrame;

public class OkActionThread implements Runnable {

	private int minLeft = 0;

	public OkActionThread(int minLeft) {// seconds
		System.out.println( "====  OkActionThread() ===="  );
		this.minLeft = minLeft;

	}

	@Override
	public void run() {
		
		while (minLeft-- != 0) {
			MainFrame.Label[7].setText(minLeft + "秒");
			System.out.println( minLeft  );
			
			try {
				new Thread();
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}

	}

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值