有两种选择:
- 开始一个新线程。该线程将包含 while 循环,并执行处理数组的方法。在每次迭代中,调用
repaint()
或invalidate()
在您的窗口上告诉它需要重绘。
- 使用计时器。GUI 线程将定期调用您的例程。
主题:
在actionPerformed
方法中,创建一个新线程。并调用它的 start 方法。线程的Runnable
应该运行一个while循环(正如您已经完成的那样),然后简单地退出。
定时器:
在您的 Timer 类型的类中创建一个对象。java.swing.Timer
如果您使用的是 swing(也有java.util.Timer
一个不适合 GUI 操作),请使用其中的一个。计时器应该有一个ActionListener
调用你的方法一次,但计时器的重复率为 1000 毫秒。
提示
- 要调用该操作,您应该将它放在一个单独的方法中,而不是直接放在按钮处理程序下。这样,您就不会从 GUI 线程外部调用 GUI 内容。
例如
tickButton.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
doTick();
}
});
停止线程的机制同样重要!一般来说,不要while(true)
在线程中使用 a ,因为它会丢失;发明一个信号量来终止它。
使用 aJToggleButton
而不是Button
?
同步:如果您使用线程,您将需要这样的东西,以防止每次按下按钮时创建新线程:
代码
Thread autoplayThread = null;
Object lock;
boolean autoplaying = false;
public void actionPerformed(ActionEvent e){
synchronized(lock){ // prevent any race condition here
if(!autoplaying && autoplayThread==null ){
autoplaying = true;
autoplayThread = new Thread(new Runnable(){
public void run(){
try{
while(autoplaying){ .... }
}finally{
synchronized(lock) {
autoplaying=false;
autoplayThread=null;
}
}
}
});
autoplayThread.start();
}else{ // stop the thread!
autoplaying=false;
}
}
}