Interface
1. Time column: Show the time now.
2. Countdown column: For input the time of
countdown number.
3. Button: For start/stop countdown or stop
alarm.
Operating
1.
Set the time you want to countdown.
Ex:1 Hour
Ex:1 Hour
2.
Click “Set”, then G Click will
start countdown.
2-1.If you want to pause or stop countdown, click “Stop”.
4.
Click “Time Up”, the ring will
stop.
為了便於維護,我習慣把程式檔分為 UI排版 跟 運算端
I'm used to separate the function code files to UI layout and function part, for easily maintain.
UI排版/UI layout
import java.awt.*;
public class GAlarmClock implements Runnable{
Thread t;
JLabel JLabel_temp= new JLabel();
private JFrame frmGalarmclock;
private JTextField hour_txt;
private JTextField minute_txt;
private JTextField second_txt;
private JButton btnSet;
boolean time_set=false; //按鈕狀態, 未設定時間=false, 已設定時間=true
MouseAdapter btnEvent;
GAlarmClock_function gfunc= new GAlarmClock_function();
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
GAlarmClock window = new GAlarmClock();
window.frmGalarmclock.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the application.
*/
public GAlarmClock() {
super();
if(t==null){
t = new Thread(this);
t.start();
}
initialize();
gfunc.functionLink(time_set, hour_txt, minute_txt, second_txt, btnSet);
}
/**
* Initialize the contents of the frame.
*/
private void initialize() {
frmGalarmclock = new JFrame();
frmGalarmclock.setTitle("G Clock_1.0");
frmGalarmclock.setResizable(false);
frmGalarmclock.setBounds(100, 100, 192, 294);
frmGalarmclock.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frmGalarmclock.getContentPane().setLayout(null);
JLabel lblNow = new JLabel("Now:");
lblNow.setFont(new Font("新細明體", Font.PLAIN, 18));
lblNow.setBounds(10, 10, 46, 23);
frmGalarmclock.getContentPane().add(lblNow);
JLabel currentTime_txt = new JLabel("");
currentTime_txt.setFont(new Font("新細明體", Font.PLAIN, 32));
currentTime_txt.setBounds(20, 43, 123, 40);
frmGalarmclock.getContentPane().add(currentTime_txt);
JLabel_temp = currentTime_txt;
JLabel lblAlarm = new JLabel("Alarm:");
lblAlarm.setFont(new Font("新細明體", Font.PLAIN, 18));
lblAlarm.setBounds(10, 124, 58, 23);
frmGalarmclock.getContentPane().add(lblAlarm);
hour_txt = new JTextField();
hour_txt.setHorizontalAlignment(SwingConstants.RIGHT);
hour_txt.setText("0");
hour_txt.setBounds(20, 160, 30, 30);
frmGalarmclock.getContentPane().add(hour_txt);
hour_txt.setColumns(10);
JLabel label = new JLabel(":");
label.setFont(new Font("新細明體", Font.PLAIN, 18));
label.setBounds(60, 161, 8, 23);
frmGalarmclock.getContentPane().add(label);
minute_txt = new JTextField();
minute_txt.setHorizontalAlignment(SwingConstants.RIGHT);
minute_txt.setText("0");
minute_txt.setColumns(10);
minute_txt.setBounds(78, 160, 30, 30);
frmGalarmclock.getContentPane().add(minute_txt);
JLabel label_1 = new JLabel(":");
label_1.setFont(new Font("新細明體", Font.PLAIN, 18));
label_1.setBounds(118, 161, 8, 23);
frmGalarmclock.getContentPane().add(label_1);
second_txt = new JTextField();
second_txt.setHorizontalAlignment(SwingConstants.RIGHT);
second_txt.setText("0");
second_txt.setColumns(10);
second_txt.setBounds(136, 160, 30, 30);
frmGalarmclock.getContentPane().add(second_txt);
btnSet = new JButton("Set");
btnSet.addMouseListener( btnEvent=new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent arg0) {
time_set = gfunc.countdown(hour_txt, minute_txt, second_txt, time_set);
gfunc.buttonStatus(btnSet, time_set);
}
});
btnSet.setBounds(47, 212, 87, 23);
frmGalarmclock.getContentPane().add(btnSet);
}
@Override
public void run() {
// TODO Auto-generated method stub
while(true){
gfunc.showClock(JLabel_temp, gfunc.clock());
//second_txt.setText("100");
try {Thread.sleep(1000);}catch (InterruptedException e) { }
}
}
}
運算端/Function part
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import javax.swing.*;
import javax.sound.sampled.*;
public class GAlarmClock_function{
int time, time_tmp;
boolean time_set;
JTextField hours_tmp, minutes_tmp, seconds_tmp;
JButton btnSet;
public void functionLink(boolean time_set1, JTextField hours_tmp1, JTextField minutes_tmp1, JTextField seconds_tmp1, JButton btnSet1
){//連結本檔的物件
time_set = time_set1;
hours_tmp = hours_tmp1;
minutes_tmp = minutes_tmp1;
seconds_tmp = seconds_tmp1;
btnSet = btnSet1;
}
public String clock(){//取得當下時間
String now;
now=new SimpleDateFormat("HH:mm:ss").format(Calendar.getInstance().getTime());
return now;
}
public void showClock(JLabel a, String b){//顯示時間到JLabel a
a.setText(b);
}
public int transformTime(String hours, String minutes,String seconds){
int time;
time = Integer.parseInt(hours)*3600 + Integer.parseInt(minutes)*60 + Integer.parseInt(seconds);
return time;
}
public boolean countdown(JTextField hours, JTextField minutes, JTextField seconds, boolean a){ //倒數
try{
time_tmp = transformTime(hours.getText(), minutes.getText(), seconds.getText());
}catch(NumberFormatException e){ //防止輸入非整數,全部輸入歸0
hours.setText("0");
minutes.setText("0");
seconds.setText("0");
//System.out.println(a);
return a=false;
}
hours_tmp=hours;
minutes_tmp=minutes;
seconds_tmp=seconds;
Thread t = new Thread(new Runnable(){
public void run(){
while(time_tmp!=0 && time_set==true){ //迴圈直到 倒數結束 or 按下按鈕改變狀態
time_tmp--; //開始倒數
transformCount(time_tmp, hours_tmp, minutes_tmp, seconds_tmp);
////System.out.println(time_tmp);
try {Thread.sleep(1000);}catch (InterruptedException e) { }
}
if(time_tmp==0) {timeUp();btnSet.setText("Time Up");}//時間到, 啟動鈴聲並讓按鈕顯示"Time Up"
}
});
if(a){
time_set=false;
t.interrupt();
}
else{
time_set=true;
t.start();
////System.out.println(a);
}
return time_set;
}
public void transformCount(int time, JTextField hours, JTextField minutes, JTextField seconds){ //將總數轉回 時 分 秒
hours.setText(Integer.toString(time/3600));
minutes.setText(Integer.toString(((time%3600))/60));
seconds.setText(Integer.toString(time%60));
}
public void buttonStatus(JButton a, boolean b){
if(b){a.setText("Stop");}
else{a.setText("Set");}
}
public void timeUp(){//時間到時的處理事件(前提為time_tmp=0)
Thread t = new Thread(new Runnable(){
public void run(){
while(time_set){
try {
//System.out.println(time_set);
// 建立 File 物件
File sf = new File("0038.WAV");//此寫法時做是可行的,但用IDE測試時會找不到檔案,需指定絕對路徑(如下)
//File sf = new File("E:\\workspace\\Java\\GAlarmClock\\src\\0038.WAV");
// 取得聲音輸入串流
AudioInputStream astr = AudioSystem.getAudioInputStream(sf);
// 取得聲音形式
AudioFormat afmt = astr.getFormat();
// 建立訊號線資訊物件
DataLine.Info inf = new DataLine.Info(SourceDataLine.class,afmt);
// 取得符合指定訊號線資訊的訊號線
SourceDataLine l = (SourceDataLine) AudioSystem.getLine(inf);
// 以指定形式開啟訊號線
l.open(afmt);
// 開始訊號線的讀寫
l.start();
// 讀寫緩衝區
byte[] buf = new byte[65536];
// 從聲音串流讀入資料寫入混音器
for( int n=0; (n=astr.read(buf,0,buf.length))>0; )
{l.write(buf,0,n);}
// 清掉混音器內的資料
l.drain();
// 關閉
l.close();
} catch (Exception e) { e.printStackTrace();}
}
}
});
t.start();
}
}
Goal of Update
1. Add dynamic effects on time up alarm, ex: color twinkling, window shake, etc…
1. Add dynamic effects on time up alarm, ex: color twinkling, window shake, etc…
2.
Add function that user can
select the alarm ring file by self.
3.
Add function that the G Click
window could be shrink to minimum size at the tool bar.
4.
Add effect that G Click window
will show on the top will time up.
Program Link
https://docs.google.com/file/d/0B2SpFawN0Ts6RTA0RE53OFdjc1k/edit?usp=sharing
=======================
如果你有好的想法或發現漏洞,歡迎提供建議
If you have good idea or find any bug, welcome to advice me.
一起成長吧!
That's grow up together!
Program Link
https://docs.google.com/file/d/0B2SpFawN0Ts6RTA0RE53OFdjc1k/edit?usp=sharing
=======================
如果你有好的想法或發現漏洞,歡迎提供建議
If you have good idea or find any bug, welcome to advice me.
一起成長吧!
That's grow up together!



沒有留言:
張貼留言