Java Swing布局的闹钟提醒程序

宣传一波我邮 => 南京邮电大学(NJUPT)

南京邮电大学计算机学院的的同胞们应该都被迫接触过Java Swing,因为毕竟要完成学校的Java大作业,我选择的是多功能数字钟程序,该题目的具体要求如下:(因为具体实现过程内容较多,源代码放在了文章最后面)

①基本要求:设计数字钟程序,可以显示当前的时间,星期,日期信息;实现闹 钟功能,预设时间到时弹出对话框进行提醒;实现闹钟的开启和关闭设置开关并且可以在钟面上查看其设置状态。
②提高要求:闹钟提醒对话框弹出时可同时播放响铃声或音乐;增加贪睡功能,例如闹钟时间到时按下贪睡按钮后结束提醒,10 分钟后再次进行提醒;增加倒计时功能,可以预设倒计时的时间,倒计时完成后弹出对话框并播放声音提醒;增加国际时钟功能,可以显示预设的在不同时区的国家的当前时间,星期和日期功能;合理设计时钟的显示界面和功能设定界面,使操作者可以用直观并且简单的方式使用和设定各个功能。

放几张程序截图:







关键模块的实现方法,关键代码的分析:

1、启动页:

放置一个textField,用来展示启动程序前强制阅读的内容,强制阅读的实现是通过判断用户是
否点击面板下方的JRadioButton来实现的,如果用户点击了该Button,就会被rb.addActionListener
捕捉到,接下来就会进入程序,如果用户不点击JRadioButton,则就不会触发ActionListener,也就
不会触发actionPerformed(ActionEvent e)中的事件,程序将无法启动。

2、主窗口时间:

通过线程执行Date()获取时间,并通过setText()实时更新在时间lable上,用户在主面板上就可以看到当前时间。

3、添加闹钟:

添加闹钟时,通过JOptionPane.showConfirmDialog()设定了提示框,获取用户的二次确认,以免用户错误设定。再用户确认设定后,获取到JOptionPane.YES_NO_OPTION以启动程序,并更新主面板上的闹钟状态为On。接下来,将用户从JComboBox中选择的时间,通过box.getSelectedItem()显示在“添加闹钟”窗口的textField中,后台通过box.getSelectedIndex()将获取到的值保存在全局变量setHour、setMin、setSec中,以便于后面判断闹钟提醒时调用。当用户进行过一次闹钟设定后,全局变量会保留上一次用户设定的闹钟时间,当用户点击“再次设定”button时,该闹钟会自动增加第二天同一时刻的闹钟,也就是接收到JOptionPane.YES_OPTION后,Day++使设定天数加一。若用户点击“重新设定”button,则清空之前数据,重置闹钟。

4、闹钟提醒:

在实现闹钟提醒时,首先将判断放入线程中,每隔20ns判断一次,以免因时间获取的误差导致误判。判断方面,将全局变量setHour、setMin、setSec中的值,分别与calendar.get(Calendar.HOUR)、calendar.get(Calendar.MINUTE)、calendar.get(Calendar.SECOND)相比较。之所以用Calender进行比较,是因为前面box.getSelectedIndex()获取到的值为int型,通过calender获取到的值为int型,可直接进行比较,而new SimpleDateFormat(“HH:mm:ss”).format(new Date())获取到的值为String型,并不方便直接比较。
4.1、贪睡功能:
当判断设定时间到达时,会弹出对话框,提醒用户设定时间已到达,并询问用户是否进行贪睡,如果选择需要用户选择时间,当用户选择相应的时间后,通过更新全局变量setHour、setMin、setSec中的值,实现闹钟的贪睡,则再次设定,完成贪睡功能;如果选择不贪睡,则通过on_off.setText(“Alarm clock status: Off”)更新主面板上的闹钟状态为Off。在闹钟提醒方面,我们加入的窗口震动功能是通过jf.setBounds ( )不断更新窗口位置实现,将setBounds ( )加入到线程中,每隔10ms更新一次窗口位置,间隔时间越短,窗口抖动越剧烈。
4.2、取消闹钟:
当用户选择取消闹钟时,会弹出对话框进行二次确认,当用户选择是,后台会获取到JOptionPane.YES_OPTION,此时将会取消原先已经设定好的闹钟。若选择否,则继续原来的闹钟设定。

5、添加计时器:

在实现倒计时功能时,提醒功能和闹钟提醒为同一套代码,仅仅对提醒的判断方式做出了相应的调整。由设定时间与系统时间作比较变更为设定倒计时时长与0:0:0作比较。具体实现方式为: 先设定全局变量DaoHour,DaoMin,DaoSec;将用户的倒计时时长分别分为时、分、秒三个变量,存储在DaoHour,DaoMin,DaoSec中,将这三个变量分别与0:0:0作比较,因为均为int型,所以可以直接进行比较。当判断(DaoHour=0)&&(DaoMin=0)&&(DaoSec=0)( 这里应该是两个等号,由于两个等号会触发写博客时的文本样式,故更改为一个等号 )三个同时成立,即可触发提醒功能。

6、外部文件打开方式:

在该程序多处使用到了外部文件打开的功能,该功能主要是借助JFileChooser类完成的,通过setCurrentDirectory( )打开默认的文件夹后,可以使用addChoosableFileFilter(new FileNameExtensionFilter( ) )
进行文件筛选。

源代码:

Github Java-Clock

/*** @author NJR10byh* @time 2020.6.1* */import jdk.nashorn.internal.scripts.JO;import javax.swing.*;
import javax.swing.filechooser.FileNameExtensionFilter;
import java.awt.*;
import java.awt.event.*;
import java.io.File;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;public class Clock implements Runnable{static int index;static String str;static int Hour,Min,Sec,Day;static int setHour,setMin,setSec;static int DaoHour,DaoMin,DaoSec;static int x=707,y=312;static int x1=720,y1=390;static int result=3;static int r=3;static int flag=1;private JLabel date;private JLabel time;static private JLabel on_off;public Clock() {//初始化图形界面final JFrame jf=new JFrame();jf.setTitle("闹钟");jf.setResizable(false);jf.setBounds(x,y,506,456);jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);JPanel jp = new JPanel(null);//日期date = new JLabel();date.setFont(new Font("微软雅黑", Font.PLAIN, 15));date.setBounds(161, 81, 200, 22);jp.add(date);//时间time = new JLabel();time.setBounds(145, 120, 230, 59);time.setFont(new Font("Arial", Font.BOLD, 55));jp.add(time);//闹钟开关状态on_off=new JLabel("Alarm clock status: Off");on_off.setBounds(235, 220, 180, 40);on_off.setFont(new Font("Arial", Font.BOLD, 16));jp.add(on_off);//创建顶部工具栏JMenuBar bar = new JMenuBar();JMenu select = new JMenu("设置");JMenu about = new JMenu("关于");about.addMouseListener(new MouseAdapter() {@Overridepublic void mousePressed(MouseEvent e) {Author(jf);}});JMenu readme = new JMenu("使用说明");readme.addMouseListener(new MouseAdapter() {@Overridepublic void mousePressed(MouseEvent e) {Method(jf);}});bar.add(select);bar.add(about);bar.add(readme);JMenuItem open=new JMenuItem("打开外部文件");open.addMouseListener(new MouseAdapter() {@Overridepublic void mouseReleased(MouseEvent e) {show(jf);}});JMenuItem save = new JMenuItem("保存设置");JMenuItem exit = new JMenuItem("退出");exit.addMouseListener(new MouseAdapter() {@Overridepublic void mouseReleased(MouseEvent e) {System.exit(0);}});select.add(open);select.add(save);select.add(exit);JLabel lb = new JLabel();lb.setIcon(new ImageIcon("time.jpg"));lb.setBounds(0, 0, 500, 400);jp.add(lb);JButton btn10 = new JButton("添加闹钟");btn10.setBounds(220, 260, 95, 33);jp.add(btn10);btn10.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {EditClock(jf);}});JButton btn11 = new JButton("取消闹钟");btn11.setBounds(330, 260, 95, 33);jp.add(btn11);btn11.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {int result=JOptionPane.showConfirmDialog(jf,"您希望取消闹钟吗?","提示",JOptionPane.YES_NO_OPTION);if(result==JOptionPane.YES_OPTION){setHour=0;setMin=0;setSec=0;on_off.setText("Alarm clock status: Off");}}});JButton btn12 = new JButton("添加计时器");btn12.setBounds(220, 300, 205, 33);jp.add(btn12);btn12.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {EditTimer(jf);}});jf.setJMenuBar(bar);jf.setContentPane(jp);jf.setVisible(true);}/*** 用一个线程来更新时间* */public void run() {while(true){try{date.setText(new SimpleDateFormat("yyyy 年 MM 月 dd 日  EEEE").format(new Date()));time.setText(new SimpleDateFormat("HH:mm:ss").format(new Date()));}catch(Throwable t){t.printStackTrace();}}}/*** Main函数* */public static void main(String[] args)throwsClassNotFoundException,UnsupportedLookAndFeelException,InstantiationException,IllegalAccessException{//使用Windows外观UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");//运行程序之前,用户需要首先阅读使用说明JFrame jDialog = new JFrame();jDialog.setSize(400, 280);jDialog.setResizable(false);  //不能最大化jDialog.setLocationRelativeTo(null);jDialog.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);JPanel jp1=new JPanel(null);//强制阅读JRadioButton rb=new JRadioButton(" 我已阅读,以上说明我已知晓! (您需要勾选此项以进入闹钟!!!)");rb.setFont(new Font("微软雅黑",Font.PLAIN,13));rb.setBounds(10,210,395,18);jp1.add(rb);JTextArea textArea=new JTextArea();textArea.setBounds(0,0,392,200);textArea.setLineWrap(true);textArea.setText("此小闹钟主面板有三个按钮: 添加闹钟、取消闹钟 和 添加计时器," +"如果运行时,未出现三个按钮,请在添加按钮附近用鼠标轻扫一下。");textArea.setFont(new Font("微软雅黑",Font.BOLD,25));jp1.add(textArea);jDialog.setContentPane(jp1);jDialog.setVisible(true);/*** 阅读完使用说明,并选中我已阅读,才能进入主面板* */rb.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {jDialog.dispose();new Thread(new Clock()).start();}});}/*** 添加闹钟*/public static void EditClock(JFrame fatherjf) {//创建窗口,且设置其为模态窗final JDialog jDialog = new JDialog(fatherjf, "设置闹钟", true);jDialog.setSize(400, 500);jDialog.setResizable(false);  //不能最大化jDialog.setLocationRelativeTo(fatherjf);Calendar calendar = Calendar.getInstance();Hour=calendar.get(Calendar.HOUR);Min=calendar.get(Calendar.MINUTE);Sec=calendar.get(Calendar.SECOND);//时间数据String[] hours = new String[]{"0", "1", "2", "3", "4", "5", "6", "7", "8", "9","10", "11", "12"};String[] minutes = new String[]{"00", "01", "02", "03", "04", "05", "06", "07", "08", "09","10", "11", "12", "13", "14", "15", "16", "17", "18", "19","20", "21", "22", "23", "24", "25", "26", "27", "28", "29","30", "31", "32", "33", "34", "35", "36", "37", "38", "39","40", "41", "42", "43", "44", "45", "46", "47", "48", "49","50", "51", "52", "53", "54", "55", "56", "57", "58", "59"};String[] seconds = new String[]{"00", "01", "02", "03", "04", "05", "06", "07", "08", "09","10", "11", "12", "13", "14", "15", "16", "17", "18", "19","20", "21", "22", "23", "24", "25", "26", "27", "28", "29","30", "31", "32", "33", "34", "35", "36", "37", "38", "39","40", "41", "42", "43", "44", "45", "46", "47", "48", "49","50", "51", "52", "53", "54", "55", "56", "57", "58", "59"};//创建下拉框final JComboBox box4 = new JComboBox(hours);final JComboBox box5 = new JComboBox(minutes);final JComboBox box6 = new JComboBox(seconds);//下拉框默认选择当前时间box4.setSelectedIndex(Hour);box5.setSelectedIndex(Min);box6.setSelectedIndex(Sec);//创建盒子Box hBox1 = Box.createHorizontalBox();//设定时间栏Box hBox2 = Box.createHorizontalBox();//重新设定的btnBox hBox3 = Box.createHorizontalBox();//时分秒Box hBox4 = Box.createHorizontalBox();//最底下两个按钮Box hBox5 = Box.createHorizontalBox();//添加音乐Box hBox6 = Box.createHorizontalBox();//顶部图片Box hBox7 = Box.createHorizontalBox();//修改顶部图片Box vBox1 = Box.createVerticalBox();/*** 设置顶部图片* */final JLabel Header=new JLabel();if(index==0){Header.setIcon(new ImageIcon("clock1.jpg"));Header.setSize(400,150);}else if(index==1){Header.setIcon(new ImageIcon("clock2.jpg"));Header.setSize(400,150);}else if(index==2){Header.setIcon(new ImageIcon("clock3.jpg"));Header.setSize(400,150);}else if(index==3){Header.setIcon(new ImageIcon("clock4.jpg"));Header.setSize(400,150);}else if(index==4){Header.setIcon(new ImageIcon("clock5.jpg"));Header.setSize(400,150);}else if(index==5){Header.setIcon(new ImageIcon("clock6.jpg"));Header.setSize(400,150);}Header.setSize(400,150);hBox6.add(Header);/*** 设定时间显示栏* */JLabel label = new JLabel("上次设定的时间为: ");final JTextField textField = new JTextField(str);textField.setPreferredSize(new Dimension(100, 50));hBox1.add(Box.createHorizontalStrut(100));hBox1.add(label);hBox1.add(Box.createHorizontalStrut(10));hBox1.add(textField);hBox1.add(Box.createHorizontalStrut(100));/*** 再次设定btn* */JButton btna=new JButton("再次设定");JButton btnb=new JButton("重新设定");btna.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {int result=JOptionPane.showConfirmDialog(jDialog,"您希望明天同一时刻再次响铃吗?","提示",JOptionPane.YES_NO_OPTION);if(result==JOptionPane.YES_OPTION){Day+=1;  //闹钟延长一天}}});btnb.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {str=new String();textField.setText(str);}});hBox2.add(btna);hBox2.add(Box.createHorizontalStrut(30));hBox2.add(btnb);//时box4.addItemListener(new ItemListener() {@Overridepublic void itemStateChanged(ItemEvent e) {if (e.getStateChange() == ItemEvent.SELECTED) {//System.out.println("选中了"+box4.getSelectedItem());textField.setText("   " +box4.getSelectedItem() + ":" +box5.getSelectedItem() + ":" +box6.getSelectedItem());str=textField.getText();setHour=box4.getSelectedIndex();setMin=box5.getSelectedIndex();setSec=box6.getSelectedIndex();}}});//分box5.addItemListener(new ItemListener() {@Overridepublic void itemStateChanged(ItemEvent e) {if (e.getStateChange() == ItemEvent.SELECTED) {//System.out.println("选中了"+box5.getSelectedItem());textField.setText("   " +box4.getSelectedItem() + ":" +box5.getSelectedItem() + ":" +box6.getSelectedItem());setHour=box4.getSelectedIndex();setMin=box5.getSelectedIndex();setSec=box6.getSelectedIndex();str=textField.getText();}}});//秒box6.addItemListener(new ItemListener() {@Overridepublic void itemStateChanged(ItemEvent e) {if (e.getStateChange() == ItemEvent.SELECTED) {//System.out.println("选中了"+box6.getSelectedItem());textField.setText("   " +box4.getSelectedItem() + ":" +box5.getSelectedItem() + ":" +box6.getSelectedItem());setHour=box4.getSelectedIndex();setMin=box5.getSelectedIndex();setSec=box6.getSelectedIndex();str=textField.getText();}}});//添加标签JLabel lbl4 = new JLabel("时: ");JLabel lbl5 = new JLabel("分: ");JLabel lbl6 = new JLabel("秒: ");/*** 添加音乐选项盒子* */JLabel lblmusic = new JLabel("添加音乐: ");JTextField textFieldmusic = new JTextField();JButton btnmusic = new JButton("浏览...");//添加 btnmusic 监听事件,用于打开文件,选择音乐btnmusic.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {showMusic(jDialog);}});hBox5.add(Box.createHorizontalStrut(88));hBox5.add(lblmusic);hBox5.add(textFieldmusic);hBox5.add(Box.createHorizontalStrut(10));hBox5.add(btnmusic);hBox5.add(Box.createHorizontalStrut(90));/*** 更换顶部图片* */String[] Wallpaper=new String[]{"clock1","clock2","clock3","clock4","clock5","clock6"};JLabel wallpaper=new JLabel("更改顶部图片: ");JComboBox wallpaper1=new JComboBox(Wallpaper);wallpaper1.setSelectedIndex(index);wallpaper1.addItemListener(new ItemListener() {@Overridepublic void itemStateChanged(ItemEvent e) {if(e.getStateChange()==ItemEvent.SELECTED){index=wallpaper1.getSelectedIndex();if(index==0){Header.setIcon(new ImageIcon("clock1.jpg"));Header.setSize(400,150);}else if(index==1){Header.setIcon(new ImageIcon("clock2.jpg"));Header.setSize(400,150);}else if(index==2){Header.setIcon(new ImageIcon("clock3.jpg"));Header.setSize(400,150);}else if(index==3){Header.setIcon(new ImageIcon("clock4.jpg"));Header.setSize(400,150);}else if(index==4){Header.setIcon(new ImageIcon("clock5.jpg"));Header.setSize(400,150);}else if(index==5){Header.setIcon(new ImageIcon("clock6.jpg"));Header.setSize(400,150);}}}});hBox7.add(Box.createHorizontalStrut(88));hBox7.add(wallpaper);hBox7.add(Box.createHorizontalStrut(8));hBox7.add(wallpaper1);hBox7.add(Box.createHorizontalStrut(88));/*** 添加按钮监听事件* */JButton btn1 = new JButton("设定");JButton btn2 = new JButton("取消");btn1.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {int Result=JOptionPane.showConfirmDialog(jDialog,"保存这个闹钟嘛?","提示",JOptionPane.YES_NO_OPTION);if(Result==JOptionPane.YES_OPTION){on_off.setText("Alarm clock status: On");jDialog.setVisible(false);result=3;new Thread() {public void run() {while (true) {try {Thread.sleep(20);Calendar calendar = Calendar.getInstance();Hour=calendar.get(Calendar.HOUR);Min=calendar.get(Calendar.MINUTE);Sec=calendar.get(Calendar.SECOND);//System.out.println(setSec);if ((setSec == Sec)&&(setMin==Min)&&(setHour==Hour)) {//利用线程实现窗口抖动new Thread("Shake"){public void run () {while ((result !=0)&&(result !=1)) {try {Thread.sleep(10);x += 10;fatherjf.setBounds(x, y, 506, 456);y -= 10;fatherjf.setBounds(x, y, 506, 456);x -= 10;fatherjf.setBounds(x, y, 506, 456);y += 10;fatherjf.setBounds(x, y, 506, 456);x += 10;fatherjf.setBounds(x, y, 506, 456);y -= 10;fatherjf.setBounds(x, y, 506, 456);x -= 10;fatherjf.setBounds(x, y, 506, 456);y += 10;fatherjf.setBounds(x, y, 506, 456);x += 10;fatherjf.setBounds(x, y, 506, 456);y -= 10;fatherjf.setBounds(x, y, 506, 456);x -= 10;fatherjf.setBounds(x, y, 506, 456);y += 10;fatherjf.setBounds(x, y, 506, 456);x += 10;fatherjf.setBounds(x, y, 506, 456);y -= 10;fatherjf.setBounds(x, y, 506, 456);x -= 10;fatherjf.setBounds(x, y, 506, 456);y += 10;fatherjf.setBounds(x, y, 506, 456);} catch (InterruptedException interruptedException) {interruptedException.printStackTrace();}}}}.start();result=JOptionPane.showConfirmDialog(jDialog,"时间到啦!!!   还要接着睡嘛????","提醒",JOptionPane.YES_NO_OPTION);if(result==JOptionPane.YES_OPTION){Sleep(fatherjf);}if(result==JOptionPane.NO_OPTION){on_off.setText("Alarm clock status: Off");}}} catch (InterruptedException interruptedException) {interruptedException.printStackTrace();}}}}.start();}}});btn2.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {on_off.setText("Alarm clock status: Off");jDialog.dispose();}});//所有组件打包进盒子hBox3.add(Box.createHorizontalStrut(85));hBox3.add(lbl4);hBox3.add(box4);hBox3.add(Box.createHorizontalStrut(19));hBox3.add(lbl5);hBox3.add(box5);hBox3.add(Box.createHorizontalStrut(19));hBox3.add(lbl6);hBox3.add(box6);hBox3.add(Box.createHorizontalStrut(130));hBox4.add(btn1);hBox4.add(Box.createHorizontalStrut(50));hBox4.add(btn2);vBox1.add(hBox6);//顶部图片vBox1.add(Box.createVerticalStrut(15));vBox1.add(hBox1);//设定时间vBox1.add(Box.createVerticalStrut(25));vBox1.add(hBox2);vBox1.add(Box.createVerticalStrut(20));vBox1.add(hBox3);//时分秒vBox1.add(Box.createVerticalStrut(30));vBox1.add(hBox5);//添加音乐vBox1.add(Box.createVerticalStrut(30));vBox1.add(hBox7);//更改顶部图片vBox1.add(Box.createVerticalStrut(60));vBox1.add(hBox4);//两个按钮vBox1.add(Box.createVerticalStrut(5));jDialog.setContentPane(vBox1);jDialog.setVisible(true);}/*** 关于弹出的信息**/public static void Author(JFrame fatherjf){final JDialog jDialog = new JDialog(fatherjf, "闹钟v1.0", true);jDialog.setSize(230, 180);jDialog.setResizable(false);  //不能最大化jDialog.setLocationRelativeTo(fatherjf);Box hbox1=Box.createHorizontalBox();//作者Box hbox2=Box.createHorizontalBox();Box hbox3=Box.createHorizontalBox();Box hbox4=Box.createHorizontalBox();//创作时间Box hbox5=Box.createHorizontalBox();//按钮Box vbox=Box.createVerticalBox();JLabel lb1=new JLabel("作者:");lb1.setFont(new Font("微软雅黑",Font.BOLD, 12));JLabel lb2=new JLabel("aaa");hbox1.add(lb1);hbox1.add(Box.createHorizontalStrut(6));hbox1.add(lb2);JLabel lb3=new JLabel("bbb");hbox2.add(lb3);JLabel lb4=new JLabel("ccc");hbox3.add(lb4);JLabel lb5=new JLabel("创作时间: ");JLabel lb6=new JLabel("2020.6.1");lb5.setFont(new Font("微软雅黑",Font.BOLD, 12));hbox4.add(lb5);hbox4.add(Box.createHorizontalStrut(8));hbox4.add(lb6);JButton btn=new JButton("确定");btn.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {jDialog.setVisible(false);}});hbox5.add(btn);vbox.add(Box.createVerticalStrut(25));vbox.add(hbox1);vbox.add(Box.createVerticalStrut(5));vbox.add(hbox2);vbox.add(Box.createVerticalStrut(5));vbox.add(hbox3);vbox.add(Box.createVerticalStrut(5));vbox.add(hbox4);vbox.add(Box.createVerticalStrut(12));vbox.add(hbox5);vbox.add(Box.createVerticalStrut(2));jDialog.setContentPane(vbox);jDialog.setVisible(true);}/*** 使用说明* */public static void Method(JFrame fatherjf){final JDialog jDialog = new JDialog(fatherjf, "使用说明", true);jDialog.setSize(315, 150);jDialog.setResizable(true);  //不能最大化jDialog.setLocationRelativeTo(fatherjf);JPanel jp=new JPanel(null);JTextArea textArea=new JTextArea();textArea.setBounds(0,0,300,150);textArea.setLineWrap(true);textArea.setText("此小闹钟主面板有三个按钮: 添加闹钟、取消闹钟 和 添加计时器," +"如果运行时,未出现三个按钮,请在添加按钮附近用鼠标轻扫一下。");textArea.setFont(new Font("微软雅黑",Font.PLAIN,16));jp.add(textArea);jDialog.setContentPane(jp);jDialog.setVisible(true);}/*** 添加计时器* */public static void EditTimer(JFrame fatherjf){final JFrame jf=new JFrame("计时器");jf.setBounds(x1,y1,480,360);jf.setResizable(false);jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);final JLabel lb1=new JLabel();lb1.setFont(new Font("Arial", Font.BOLD, 60));lb1.setText("0:0:0");JLabel lb2=new JLabel("添加倒计时: ");lb2.setFont(new Font("宋体",Font.BOLD,20));Box hbox=Box.createHorizontalBox(); //时间显示hbox.add(lb1);//时间数据String[] hours = new String[]{"0", "1", "2", "3", "4", "5", "6", "7", "8", "9","10", "11", "12"};String[] minutes = new String[]{"0", "1", "2", "3", "4", "5", "6", "7", "8", "9","10", "11", "12", "13", "14", "15", "16", "17", "18", "19","20", "21", "22", "23", "24", "25", "26", "27", "28", "29","30", "31", "32", "33", "34", "35", "36", "37", "38", "39","40", "41", "42", "43", "44", "45", "46", "47", "48", "49","50", "51", "52", "53", "54", "55", "56", "57", "58", "59"};String[] seconds = new String[]{"0", "1", "2", "3", "4", "5", "6", "7", "8", "9","10", "11", "12", "13", "14", "15", "16", "17", "18", "19","20", "21", "22", "23", "24", "25", "26", "27", "28", "29","30", "31", "32", "33", "34", "35", "36", "37", "38", "39","40", "41", "42", "43", "44", "45", "46", "47", "48", "49","50", "51", "52", "53", "54", "55", "56", "57", "58", "59"};JLabel lbl1 = new JLabel("时: ");JLabel lbl2 = new JLabel("分: ");JLabel lbl3 = new JLabel("秒: ");//创建下拉框final JComboBox box1 = new JComboBox(hours);//时final JComboBox box2 = new JComboBox(minutes);//分final JComboBox box3 = new JComboBox(seconds);//秒//时box1.addItemListener(new ItemListener() {@Overridepublic void itemStateChanged(ItemEvent e) {if (e.getStateChange() == ItemEvent.SELECTED) {lb1.setText(box1.getSelectedItem() + ":" +box2.getSelectedItem() + ":" +box3.getSelectedItem());flag=1;DaoHour=box1.getSelectedIndex();DaoMin=box2.getSelectedIndex();DaoSec=box3.getSelectedIndex();}}});//分box2.addItemListener(new ItemListener() {@Overridepublic void itemStateChanged(ItemEvent e) {if (e.getStateChange() == ItemEvent.SELECTED) {lb1.setText(box1.getSelectedItem() + ":" +box2.getSelectedItem() + ":" +box3.getSelectedItem());flag=1;DaoHour=box1.getSelectedIndex();DaoMin=box2.getSelectedIndex();DaoSec=box3.getSelectedIndex();}}});//秒box3.addItemListener(new ItemListener() {@Overridepublic void itemStateChanged(ItemEvent e) {if (e.getStateChange() == ItemEvent.SELECTED) {lb1.setText(box1.getSelectedItem() + ":" +box2.getSelectedItem() + ":" +box3.getSelectedItem());flag=1;DaoHour=box1.getSelectedIndex();DaoMin=box2.getSelectedIndex();DaoSec=box3.getSelectedIndex();}}});Box hbox0=Box.createHorizontalBox(); //lb2Box hbox1=Box.createHorizontalBox(); //时、分、秒Box hbox2=Box.createHorizontalBox();//两个ButtonBox vbox=Box.createVerticalBox(); //竖直方向盒子JButton btn1=new JButton("设定");JButton btn2=new JButton("取消");/*** 倒计时功能* */btn1.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {r=3;flag=1;new Thread(){@Overridepublic void run() {//System.out.println(flag);while ((r != 0) && (r != 1)&& flag==1) {try {Thread.sleep(1000);//System.out.println(flag);if (DaoSec != -1) {DaoSec--;lb1.setText(DaoHour + ":" + DaoMin + ":" + DaoSec);}if(DaoHour==0&&DaoMin!=0&&DaoSec==-1){DaoMin--;DaoSec=59;lb1.setText(DaoHour + ":" + DaoMin + ":" + DaoSec);}if(DaoHour!=0&&DaoMin!=0&&DaoSec==-1){DaoMin--;DaoSec=59;lb1.setText(DaoHour + ":" + DaoMin + ":" + DaoSec);}if(DaoHour!=0&&DaoMin==0&&DaoSec==-1){DaoMin=59;DaoSec=59;lb1.setText(DaoHour + ":" + DaoMin + ":" + DaoSec);}if(DaoHour!=0&&DaoMin==0&&DaoSec==0){DaoHour--;DaoMin=59;DaoSec=59;}if ((DaoHour==0)&&(DaoMin==0)&&(DaoSec==0)) {//利用线程实现窗口抖动new Thread("Shake") {public void run() {while ((r != 0) && (r != 1)) {try {Thread.sleep(10);x1 += 10;jf.setBounds(x1, y1, 480, 360);y1 -= 10;jf.setBounds(x1, y1, 480, 360);x1 -= 10;jf.setBounds(x1, y1, 480, 360);y1 += 10;jf.setBounds(x1, y1, 480, 360);x1 += 10;jf.setBounds(x1, y1, 480, 360);y1 -= 10;jf.setBounds(x1, y1, 480, 360);x1 -= 10;jf.setBounds(x1, y1, 480, 360);y1 += 10;jf.setBounds(x1, y1, 480, 360);x1 += 10;jf.setBounds(x1, y1, 480, 360);y1 -= 10;jf.setBounds(x1, y1, 480, 360);x1 -= 10;jf.setBounds(x1, y1, 480, 360);y1 += 10;jf.setBounds(x1, y1, 480, 360);x1 += 10;jf.setBounds(x1, y1, 480, 360);y1 -= 10;jf.setBounds(x1, y1, 480, 360);x1 -= 10;jf.setBounds(x1, y1, 480, 360);y1 += 10;jf.setBounds(x1, y1, 480, 360);} catch (InterruptedException interruptedException) {interruptedException.printStackTrace();}}}}.start();r= JOptionPane.showConfirmDialog(jf,"倒计时结束!!","提醒",JOptionPane.YES_NO_OPTION);}if(r==JOptionPane.YES_OPTION||r==JOptionPane.NO_OPTION){flag=0;}} catch (InterruptedException interruptedException) {interruptedException.printStackTrace();}}}}.start();}});btn2.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {System.exit(0);}});hbox0.add(lb2);hbox1.add(Box.createHorizontalStrut(70));hbox1.add(lbl1);hbox1.add(Box.createHorizontalStrut(5));hbox1.add(box1);hbox1.add(Box.createHorizontalStrut(30));hbox1.add(lbl2);hbox1.add(Box.createHorizontalStrut(5));hbox1.add(box2);hbox1.add(Box.createHorizontalStrut(30));hbox1.add(lbl3);hbox1.add(Box.createHorizontalStrut(5));hbox1.add(box3);hbox1.add(Box.createHorizontalStrut(70));hbox2.add(btn1);hbox2.add(Box.createHorizontalStrut(20));hbox2.add(btn2);vbox.add(Box.createVerticalStrut(50));vbox.add(hbox);vbox.add(Box.createVerticalStrut(20));vbox.add(hbox0);vbox.add(Box.createVerticalStrut(30));vbox.add(hbox1);vbox.add(Box.createVerticalStrut(66));vbox.add(hbox2);vbox.add(Box.createVerticalStrut(2));jf.setContentPane(vbox);jf.setVisible(true);}/*** 文件选择函数* */static void showMusic(Component parent) {JFileChooser music = new JFileChooser();music.setCurrentDirectory(new File("."));//.为当前文件夹music.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);music.setMultiSelectionEnabled(false);//添加文件过滤器,只允许音乐文件(mp3、flac、ape、wav)music.addChoosableFileFilter(new FileNameExtensionFilter("音乐文件(*.mp3,*.flac,*.wav,*.ape)", "mp3", "flac", "ape", "wav"));int result = music.showOpenDialog(parent);if (result == JFileChooser.APPROVE_OPTION) {File[] files = music.getSelectedFiles();for (File file : files) {System.out.println(file.getName());}}}/*** 外部文件打开函数* */static void show(Component parent) {JFileChooser file1 = new JFileChooser();file1.setCurrentDirectory(new File(".")); //.为当前文件夹file1.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);file1.setMultiSelectionEnabled(false);int result = file1.showOpenDialog(parent);if (result == JFileChooser.APPROVE_OPTION) {File[] files = file1.getSelectedFiles();for (File file : files) {System.out.println(file.getName());}}}/*** 贪睡功能* */public static void Sleep(JFrame framejf) {//创建窗口,且设置其为模态窗//final JDialog jDialog1 = new JDialog(fatherjdialog, "贪睡", true);final JFrame JF=new JFrame("贪睡");JF.setSize(200, 200);JF.setResizable(false);  //不能最大化JF.setLocationRelativeTo(framejf);Box hbox=Box.createHorizontalBox();Box hbox1=Box.createHorizontalBox();Box hbox2=Box.createHorizontalBox();Box hbox3=Box.createHorizontalBox();Box vbox=Box.createVerticalBox();JButton btntest=new JButton("10秒(测试功能)");JButton btn1=new JButton("2分钟");JButton btn2=new JButton("10分钟");JButton btn3=new JButton("1小时");//贪睡10秒(测试功能)btntest.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {setSec+=10;JF.setVisible(false);new Thread() {public void run() {while (true) {try {Thread.sleep(100);Calendar calendar = Calendar.getInstance();Hour=calendar.get(Calendar.HOUR);Min=calendar.get(Calendar.MINUTE);Sec=calendar.get(Calendar.SECOND);if ((setSec == Sec)&&(setMin==Min)&&(setHour==Hour)) {int result=JOptionPane.showConfirmDialog(framejf,"时间到啦!!!   还要接着睡嘛????","提醒",JOptionPane.YES_NO_OPTION);if(result==JOptionPane.YES_OPTION){Sleep(framejf);}if(result==JOptionPane.NO_OPTION){on_off.setText("Alarm clock status: Off");}}} catch (InterruptedException interruptedException) {interruptedException.printStackTrace();}}}}.start();}});//贪睡2分钟btn1.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {setMin+=2;JF.setVisible(false);new Thread() {public void run() {while (true) {try {Thread.sleep(100);Calendar calendar = Calendar.getInstance();Hour=calendar.get(Calendar.HOUR);Min=calendar.get(Calendar.MINUTE);Sec=calendar.get(Calendar.SECOND);if ((setSec == Sec)&&(setMin==Min)&&(setHour==Hour)) {int result=JOptionPane.showConfirmDialog(framejf,"时间到啦!!!   还要接着睡嘛????","提醒",JOptionPane.YES_NO_OPTION);if(result==JOptionPane.YES_OPTION){Sleep(framejf);}if(result==JOptionPane.NO_OPTION){on_off.setText("Alarm clock status: Off");}}} catch (InterruptedException interruptedException) {interruptedException.printStackTrace();}}}}.start();}});//贪睡10分钟btn1.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {setMin+=10;JF.setVisible(false);new Thread() {public void run() {while (true) {try {Thread.sleep(100);Calendar calendar = Calendar.getInstance();Hour=calendar.get(Calendar.HOUR);Min=calendar.get(Calendar.MINUTE);Sec=calendar.get(Calendar.SECOND);if ((setSec == Sec)&&(setMin==Min)&&(setHour==Hour)) {int result=JOptionPane.showConfirmDialog(framejf,"时间到啦!!!   还要接着睡嘛????","提醒",JOptionPane.YES_NO_OPTION);if(result==JOptionPane.YES_OPTION){Sleep(framejf);}if(result==JOptionPane.NO_OPTION){on_off.setText("Alarm clock status: Off");}}} catch (InterruptedException interruptedException) {interruptedException.printStackTrace();}}}}.start();}});//贪睡1小时btn1.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {setHour+=1;JF.setVisible(false);new Thread() {public void run() {while (true) {try {Thread.sleep(100);Calendar calendar = Calendar.getInstance();Hour=calendar.get(Calendar.HOUR);Min=calendar.get(Calendar.MINUTE);Sec=calendar.get(Calendar.SECOND);if ((setSec == Sec)&&(setMin==Min)&&(setHour==Hour)) {int result=JOptionPane.showConfirmDialog(framejf,"时间到啦!!!   还要接着睡嘛????","提醒",JOptionPane.YES_NO_OPTION);if(result==JOptionPane.YES_OPTION){Sleep(framejf);}if(result==JOptionPane.NO_OPTION){on_off.setText("Alarm clock status: Off");}}} catch (InterruptedException interruptedException) {interruptedException.printStackTrace();}}}}.start();}});hbox.add(btntest);hbox1.add(btn1);hbox2.add(btn2);hbox3.add(btn3);vbox.add(Box.createVerticalStrut(10));vbox.add(hbox);vbox.add(Box.createVerticalStrut(15));vbox.add(hbox1);vbox.add(Box.createVerticalStrut(15));vbox.add(hbox2);vbox.add(Box.createVerticalStrut(15));vbox.add(hbox3);JF.setContentPane(vbox);JF.setVisible(true);}}

NJUPT - Java Swing布局 - 闹钟提醒相关推荐

  1. Java Swing布局管理器(详解版)

    在使用 Swing 向容器添加组件时,需要考虑组件的位置和大小.如果不使用布局管理器,则需要先在纸上画好各个组件的位置并计算组件间的距离,再向容器中添加.这样虽然能够灵活控制组件的位置,实现却非常麻烦 ...

  2. java swing 布局_Java的Swing布局

    一.流布局FlowLayout 默认地,自左向右逐个排列 当一行排满时,自动排到下一行 setPreferredSize():控制每个控件的显示高度和宽度 案例效果 MyFrame.java pack ...

  3. java swing 布局心得(避免忘记)

    swing布局一定要用netbean 的原生布局插件 或eclipse 的window builder 插件 否则手写太麻烦 也容易错,建议使用window builder window builde ...

  4. 【Java Swing探索之路系列】之二:Java Swing布局面板组件

    作者:郭嘉 邮箱:allenwells@163.com 博客:http://blog.csdn.net/allenwells github:https://github.com/AllenWell 面 ...

  5. java swing 布局_java swing的四种常用布局

    第三种卡片布局可用于完成简单的抽奖程序,这个还是挺有趣的. 一:流式布局FlowLayout 实现代码: import java.awt.FlowLayout ; import javax.swing ...

  6. Java Swing布局管理器

    引言 在使用 Swing 向容器添加组件时,需要考虑组件的位置和大小.如果不使用布局管理器,则需要先在纸上画好各个组件的位置并计算组件间的距离,再向容器中添加.这样虽然能够灵活控制组件的位置,实现却非 ...

  7. java swing 布局 north_Java swing布局详解(附示例图)

    当选择使用JPanel和顶层容器的content pane时,需要考虑布局管理.JPanel缺省是初始化一个FlowLayout,而content pane缺省是初始化一个BorderLayout. ...

  8. Java Swing教程_v20210204

    Swing简介:Swing是什么? Java Swing JFrame和JPanel:窗口容器和面板容器 Java Swing布局管理器(详解版)

  9. java swing 页面布局方式_javaswing酷炫界面

    java swing怎样开发出漂亮的界面 Swing 支持切换界面风格啊... 默认的是Metal风格,确实不好看 你可以切换为Windows风格,看起来和Windows上的程序就是一样滴了,还可以切 ...

最新文章

  1. 邻接表存储图的广度优先遍历
  2. java jdk下载过慢 解决方案
  3. Python 操作Word文档插入图片和表格实例演示
  4. C++学习笔记7[指针]
  5. 如何优化 App 的启动耗时?
  6. spring整合hibernate事务编程中错误分析
  7. 【Vue】基础入门 —— 黑马程序员
  8. 遗传算法原理,交叉、变异、适应度函数的设置
  9. 中国最美的一千个汉字 : 千字文
  10. 计算机控制电机启动接线图,电机控制线路图大全(上下)
  11. VmodCAM图像采集 VGA显示
  12. VTK和numpy的整合
  13. 一些感觉挺有意思的例子
  14. izone成员_IZONE成员经历介绍,简介
  15. RML2016.10a数据集生成环境配置
  16. 基于51单片机LCD1602显示
  17. 计算机应用基础大作业0483,西南大学2020年春季计算机应用基础【0483】课程考试大作业参考答案.pdf...
  18. 开心笑谈的背后是中国式无奈
  19. Delphi深度之旅——网络游戏外挂制作
  20. 使用Arduino制作自动宠物喂食机

热门文章

  1. Jmeter分布式压测
  2. 计算机导师带教活动记录,指导教师带教工作总结
  3. 记录【狼追兔子问题】
  4. C++编程面向对象2020年重庆新冠肺炎信息统计
  5. 合工大计算机组成原理ppt,合工大考研课件计算机组成原理第六章
  6. 如何搭建视频转码集群、播放服务器
  7. mysql编码问题——charset=utf8你真的弄明白了吗?
  8. java 矩阵分解_计算方法(三)矩阵分解1-正交分解(QR分解)
  9. 嵌入式开发前景怎么样?嵌入式开发有哪些优势?
  10. 做自媒体短视频,做好了这8点,你每天也可以收益200+