2006-09-05

java.util.Timer vs javax.swing.Timer

javax.swing.Timer.start()这个方法跟Thread.start()的方法含义是不一样的。前者的作用是把这个timer放到一个TimerQueue里去。这个TimerQueue是一个独立的进程,可以循环执行它所管辖的timer的post方法,post的意思就是这个timer到期了,可以通知以使事件发生。所以,如果想让你注册进来的actionlistener执行的话需要的不是timer.start(), 而是timer.post(),但是你不会有这个执行权利,因为它的访问权限是package。
你可能想了,那我能不能新建立一个thread来执行TimerQueue呢?也不可以。同样受访问权限限制。所以,惟一可能的办法就是把它放到swing的运行环境中,让swing来维护这个TimerQueue:
//javax.swing.Timer
public class SwingTimer extends JFrame
{
private ActionListener listener = new ActionListener(){
public void actionPerformed(ActionEvent e){
System.out.println("^^^^^^^^^^^");
}
};

public SwingTimer(){
super();
new Timer(1000, listener).start();
}

public static void main(String[] args){
//怪事,如果不设visible或设为false就不会循环执行,闷!
new SwingTimer().setVisible(true);
}
}

或者,你找的是这个东西:
//java.util.Timer
public static void main(String[] args)
{
TimerTask task = new TimerTask(){
public void run(){
System.out.println("^^^^^^^^^^");
}
};
Timer timer = new Timer();
//0millisecond后开始执行,每1000milliseconds执行一次
timer.schedule(task, 0, 1000);
}

No comments: