package pers.yuanzi.tomoto;
import java.awt.GridLayout;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Scanner;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
//主函数类,分别调用左右两视图
public class UI extends JFrame {
	Text panel1 = new Text();
	Time panel2 = new Time();
	File file = new File("toDoList.txt");
	
	public UI() {
		
		try
		{	//每次打开是读取文件,没有则创建
			file.createNewFile();
			Scanner input = new Scanner(file);
			StringBuffer buffer = new StringBuffer();
			while (input.hasNextLine()) {
				buffer.append(input.nextLine());
			}
			panel1.text.setText(buffer.toString());
			input.close();
		}catch(Exception e)
		{
			e.printStackTrace();
			throw new RuntimeException(e);
		} 
		addWindowListener(new WindowAdapter() {
			@Override
			public void windowClosing(WindowEvent e) {
				//关闭时保存计划
				String str = new String(panel1.text.getText());
				try {
					PrintWriter output = new PrintWriter(file);
					output.print(str);
					output.flush();
					output.close();
				} catch (FileNotFoundException e1) {
					e1.printStackTrace();
					throw new RuntimeException(e1);
				}
				//退出时提醒
				if (JOptionPane.showConfirmDialog(null, "退出", "提示", JOptionPane.YES_NO_OPTION,
						JOptionPane.QUESTION_MESSAGE) == JOptionPane.YES_OPTION) {
					System.exit(0);
				}
			}
		});
		setLayout(new GridLayout(1, 2, 20, 20));
		setTitle("Tomato");
		setSize(700, 400);
		setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
		setVisible(true);
		add(panel1);
		add(panel2);
	}
	
	public static void main(String[] args) {
		UI ui =new UI();
	}
}
package pers.yuanzi.tomoto;
import java.awt.BorderLayout;
import java.awt.Font;
import java.awt.GridLayout;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
//左边计划视图
public class Text extends JPanel{
	
	JTextArea text = new JTextArea();
	JLabel label = new JLabel("To do list:");
	JLabel empty = new JLabel("");
	int i = 0;
	
	public Text() {
		setLayout(new BorderLayout(10,10));
		
		label.setFont(new Font("微软雅黑", Font.PLAIN, 14));
		empty.setFont(new Font("微软雅黑", Font.PLAIN, 14));
		text.setColumns(22);
		text.setRows(22);
		text.setLineWrap(true);
		text.setWrapStyleWord(true);
		text.setFont(new Font("微软雅黑", Font.PLAIN, 14));
		
		JScrollPane scrollPanel = new JScrollPane(text);
		
		add(label,BorderLayout.NORTH);
		add(scrollPanel,BorderLayout.CENTER);
		add(empty,BorderLayout.SOUTH);
	}
}
package pers.yuanzi.tomoto;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Timer;
import java.util.TimerTask;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
public class Time extends JPanel {
	JLabel label1 = new JLabel("时");
	JLabel label2 = new JLabel("分");
	JLabel label3 = new JLabel("秒");
	JTextField text1 = new JTextField("0", 3);
	JTextField text2 = new JTextField("30", 3);
	JTextField text3 = new JTextField("0", 3);
	JButton button2 = new JButton("暂停/恢复");
	JButton button3 = new JButton("重置");
	int hours = 0, minutes = 0, seconds = 0;
	int stop = 1;
	Timer timer = new Timer();
	TimerTask timerTask = null;
	public Time() {
		//重置按钮默认30秒
		button3.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent arg0) {
				if (timerTask != null) {
					stop = 1;
					timerTask.cancel();
				}
				text1.setText("0");
				text2.setText("30");
				text3.setText("0");
			}
		});
		
		//开始暂停按钮
		button2.addActionListener(new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent e) {
				checkTime();
				hours = Integer.parseInt(text1.getText());
				minutes = Integer.parseInt(text2.getText());
				seconds = Integer.parseInt(text3.getText());
				if (1 == stop) {
					stop = 0;
				} else {
					stop = 1;
				}
				//倒计时核心,创建一个倒计时更新视图
				timer.schedule(timerTask = new TimerTask() {
					@Override
					public void run() {
						if (1 == stop) {
							text1.setText(hours + "");
							text2.setText(minutes + "");
							text3.setText(seconds + "");
							this.cancel();
						} else {
							if (0 != seconds) {
								seconds -= 1;
								text3.setText(seconds + "");
							} else if (0 != minutes) {
								minutes -= 1;
								text2.setText(minutes + "");
								seconds = 59;
								text3.setText(seconds + "");
							} else if (0 != hours) {
								hours -= 1;
								text1.setText(hours + "");
								minutes = 59;
								text2.setText(minutes + "");
								seconds = 59;
								text3.setText(seconds + "");
							} else {
								this.cancel();
								playSound();
								JOptionPane.showMessageDialog(null, "时间到了!", "提示", JOptionPane.INFORMATION_MESSAGE);
								
								stop = 1;
							}
						}
					}
				}, 0, 1000);
			}
		});
		JPanel jPanel1 = new JPanel();
		jPanel1.setLayout(new GridLayout(1, 6, 10, 10));
		jPanel1.add(text1);
		jPanel1.add(label1);
		jPanel1.add(text2);
		jPanel1.add(label2);
		jPanel1.add(text3);
		jPanel1.add(label3);
		JPanel jPanel2 = new JPanel();
		jPanel2.setLayout(new GridLayout(1, 2, 20, 20));
		jPanel2.add(button2);
		jPanel2.add(button3);
		setLayout(new GridLayout(8, 1, 10, 20));
		add(jPanel1);
		add(jPanel2);
	}
	//检查时间是否正确输入
	private void checkTime() {
		if (!isDigit(text1.getText()) || !isDigit(text2.getText()) || !isDigit(text3.getText())
				|| Integer.parseInt(text2.getText()) < 0 || Integer.parseInt(text2.getText()) > 59
				|| Integer.parseInt(text2.getText()) < 0 || Integer.parseInt(text3.getText()) > 59
				|| Integer.parseInt(text3.getText()) < 0) {
			JOptionPane.showMessageDialog(null, "请输入合法范围的时间!", "提示", JOptionPane.INFORMATION_MESSAGE);
			button3.doClick();
		}
	}
	private boolean isDigit(String str) {
		for (int i = 0; i < str.length(); i++) {
			if (!Character.isDigit(str.charAt(i)))
				return false;
		}
		return true;
	}
	//警告时的声音方法
	private void playSound() {
		/*AudioClip audioClip=getAudioClip(getCodeBase(),"directory of audio");
		audioClip.play();*/
		/*AudioClip au = null;
		try {
			au = Applet.newAudioClip(new File("近藤浩治 - Nintendo Mark.mid").toURL());
			au.play();
		} catch (MalformedURLException e) {
			e.printStackTrace();
			throw new RuntimeException(e);
		}*/
		try {
			Clip clip = AudioSystem.getClip();
			AudioInputStream inputStream = AudioSystem
					.getAudioInputStream(Time.class.getResourceAsStream("近藤浩治 - Nintendo Mark.mid"));
			clip.open(inputStream);
			clip.start();
		} catch (Exception e) {
			System.err.println(e.getMessage());
		}
	}
}