我正试图在java swing中实现Simon游戏,在那里我需要播放计算机在GUI中生成的序列。这是我的代码:
import javax.swing.Timer;
for(int i : simon.getSequence()) {
lightPanels(i);
Timer timer = new Timer(1000, e -> {
darkenPanels(i);
});
timer.setRepeats(false);
timer.start();
}
我有四个按钮,每个按钮都有不同的颜色,需要根据顺序一个接一个地点亮,延迟1秒。假设序列是[0,1,2]。我需要与数字0相关的按钮亮一秒钟并使其变暗。之后,与1相关的按钮会亮一秒钟,依此类推。我从上面的代码中得到的结果是,所有按钮都同时亮起,并在1秒后变暗。我猜是每个在自己线程上运行的计时器导致了这个问题。我该如何解决此类问题?我对Java和编程没有太多经验,所以请耐心等待
这样的东西可能会起作用。我使用常规的Timer
,因为我没有创建用于测试的GUI。轻度测试,警告自负。
public static void main( String[] args ) {
List<Integer> sequence = Arrays.asList( 1,2,3,4, 1,2,3,4 );
TimerTask task = new SimonTimeTask( sequence );
new Timer().scheduleAtFixedRate( task, 0, 1000 );
}
///////////////////
class SimonTimeTask extends TimerTask {
private final List<Integer> seq;
private int index = -1;
public SimonTimeTask( List<Integer> sequence ) {
seq = sequence;
}
@Override
public void run() {
if( index >= seq.size() ) {
this.cancel();
return;
}
if( index > 0 ) darkenPanels( seq.get( index ) );
index++;
if( index < seq.size() ) lightenPanels( seq.get( index ) );
}
private void darkenPanels( int index ) {
System.out.println( "darken: " + index );
}
private void lightenPanels( int index ) {
System.out.println( "lighten: " + index );
}
}