在Java Swing中的for循环中创建延迟



我正试图在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 );
   }
   
}

最新更新