2015-02-10 4 views
0

Представьте себе массив чисел. Конкретная кнопка с номером, которая должна мигать. Я должен пройти через массив. Теперь таймер качания мигает одной кнопкой в ​​порядке, но если я попытаюсь установить цикл for(int I=0;i<array.length;i++), перейдите к следующей кнопке - таймер этого не сделает. Любая помощь будет оценена по достоинству. Спасибо. Вот код, который у меня есть сейчас:Java Swing Timer Loop

Timer startGame = new Timer(1000, new ActionListener() { 
     int colorPlay = 1;//which sqaure to blink 
     int blinkingState = 0; 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      if (blinkingState < 2) { 
       int i = blinkingState % 2; 
       switch (i) { 
        case 0: 
         if (colorPlay == 1) { 
          greenButton.setBackground(Color.green); 
         } else if (colorPlay == 2) { 
          redButton.setBackground(Color.red); 
         } else if (colorPlay == 3) { 
          blueButton.setBackground(Color.blue); 
         } else if (colorPlay == 4) { 
          yellowButton.setBackground(Color.yellow); 
         } 
         break; 
        case 1: 
         if (colorPlay == 1) { 
          greenButton.setBackground(lightGreen); 
         } else if (colorPlay == 2) { 
          redButton.setBackground(lightRed); 

         } else if (colorPlay == 3) { 
          blueButton.setBackground(lightBlue); 
         } else if (colorPlay == 4) { 
          yellowButton.setBackground(lightYellow); 
         } 
         break; 
       }//switch ends 
       blinkingState++; 
      }//if blinking<2 ends 
     }//actionPerformed ends 
    });//timer ends 
+0

Является ли 'for (int I = 0; i kiheru

+0

Да, он свободен от опечаток. Только если я поставил для (.......) цикл, он дает ошибку: «незаконный старт типа. Не удается найти класс символов i ...» Я попытался объявить int i в конструкторе - бесполезно. Спасибо за попытку помочь – user3438186

+0

Было бы проще сказать, что такое ошибка, если вы показали то, что вы на самом деле писали. Но, в любом случае, если цикл выше действительно то, что вы пробовали: вы, по-видимому, намерены использовать индекс цикла 'I', но на самом деле изменить' i'. Предположим, что вы используете 'I' в качестве индекса массива, он остается' 0', так как он никогда не был изменен => затронута только первая кнопка. – kiheru

ответ

1

Ваша логика кажется неисправной. Чего вы хотите:

  • Blink зеленый свет
  • Подождите
  • Blink красный свет
  • Подождите
  • Blink желтый свет

Если мигнутие

  • Установите регулярный backgr ound цвет
  • Подождите
  • поджег цвет фона

Это означает, что вы, вероятно, лучше с двумя Timer экземплярами.

Timer lightTimer = new Timer(2000, new ActionListener(){ 
    private int lightCounter = 0; 
    @Override 
    public void actionPerformed(ActionEvent e){ 
    switch(lightCounter){ 
     case ...: 
     final JButton lightButton = ...; 
     lightButton.setBackground(regularColour); 
     Timer blinkingTimer = new Timer(1000, new ActionListener(){ 
     @Override 
     public void actionPerformed(ActionEvent e){ 
      lightButton.setColor(lightColour); 
     } 
     } 
     blinkingTimer.setRepeats(false); 
     blinkingTimer.start(); 
    } 
    lightCounter++; 
    if (lightCounter == numberOfLights){ 
     ((Timer)e.getSource()).stop(); 
    } 
    } 
}); 
lightTimer.setRepeats(true); 
lightTimer.start(); 

Что-то по строкам вышеуказанного кода должно это сделать. Обратите внимание:

  • Я использую второй таймер для включения мигающего света обратно в прежнем состоянии (BlinkingTimer переменного)
  • BlinkingTimer использует setRepeats(false), как это нужно только, чтобы срабатывать один раз
  • The LightTimer использований setRepeats(true), так как он должен выполняться несколько раз и выключается, когда он пропускает все огни
+0

Робин, спасибо за ответ. Только в моем случае lightCounter предположит, что нужно пройти список массивов и в зависимости от того, какой номер там - мигать, что кнопка, затем, когда это будет завершено - перейти к следующему миганию и т. Д. Если я положу таймер в цикле - он приносит только последний мигание , Мне не разрешено использовать потоки – user3438186

+0

@ user3438186 Это именно то, что делает мой код. Я не получил доступ к массиву, но строка 'final JButton lightButton = ...;' должна получить правильную кнопку из массива. Код, который я опубликовал, был иллюстрацией, но не полным решением (так же, как я добавил только один случай в коммутаторе), но это должно быть тривиально, чтобы завершить его._ Мне не разрешено использовать threads_ Euhm, даже Swing 'Timer' использует фоновый поток, поэтому вы используете несколько потоков – Robin

+0

Robin! Спасибо за код, после того, как я отправил свой комментарий к вам, я снова просмотрел ваш образец и понял его так, как вы помогли, - добавил случаи и получил значение для LightCounter из списка массивов. Фу, не могу сказать, насколько это мне помогло .... – user3438186

Смежные вопросы