Как мне сделать эту Java для паузы цикла на 1/2 секунды между каждой итерации? - PullRequest
0 голосов
/ 29 мая 2011
private class MultipleGensListener implements ActionListener
   {
    public void actionPerformed(ActionEvent e)
        {
            for(int i = 0; i < 25; i++)
            {
                game.runSimulationOneGen();
                changeGrid();
            }
        }
   }

// это цикл.Метод changeGrid отображает игровую сетку в графическом интерфейсе, но // на экране видна только 25-я итерация.Я бы хотел, чтобы каждый из них был // виден примерно за полсекунды, прежде чем цикл продолжится.// Я видел ответы на некоторые вопросы, которые очень близки к тому, что я спрашиваю, // но я просто не понимаю, как применить его к моей программе. // Спасибо за любую помощь.

Ответы [ 3 ]

5 голосов
/ 29 мая 2011

Если код, выполняемый моделированием, быстрый и не потребляет слишком много ресурсов ЦП и времени, подумайте об использовании таймера Swing для выполнения цикла и задержки.В противном случае вам потребуется использовать фоновый поток, такой как это можно сделать с объектом SwingWorker.

Например, если вы используете оба Swing Timer и SwingWorker:

   private class MultipleGensListener implements ActionListener {
      protected static final int MAX_INDEX = 25;

      public void actionPerformed(ActionEvent e) {
         int timerDelay = 500; // ms delay
         new Timer(timerDelay, new ActionListener() {
            int index = 0;

            public void actionPerformed(ActionEvent e) {
               if (index < MAX_INDEX) { // loop only MAX_INDEX times
                  index++;

                  // create the SwingWorker and execute it
                  new SwingWorker<Void, Void>() {
                     @Override
                     protected Void doInBackground() throws Exception {
                        game.runSimulationOneGen(); // this is done in background thread.
                        return null;
                     }

                     @Override
                     protected void done() {
                        changeGrid(); // this is called on EDT after background thread done.
                     }
                  }.execute(); // execute the SwingWorker
               } else {
                  ((Timer) e.getSource()).stop(); // stop the timer
               }
            }
         }).start(); // start the Swing timer
      }
   }
3 голосов
/ 29 мая 2011

НИКОГДА НЕ ЗАБЛОКИРУЙТЕ РЕЗЮМЕ СОБЫТИЙ GUI

Вы можете использовать таймер для этого и запускать его только 25 раз

final Timer t = new Timer(500,null);
t.addActionListener(new ActionListener(){
     int i=0;
     public void actionPerformed(ActionEvent e){
         game.runSimulationOneGen();//run 1 iteration per tick
         changeGrid();
         if(i>25){t.stop();}
         i++;
     }
});
t.setRepeats(true);
t.start();

Кстати, причина, по которой отображается только последняя итерация, заключается в том,Обновления (перерисовки) выполняются в отдельном событии, но чтобы позволить другому событию инициировать, вам нужно вернуться из метода слушателя, который вы не

, показали, что Таймер, который я показал, является более сложной итерацией, которая позволяет другим событиям запускаться.между итерациями, позволяющими графическому интерфейсу отображать изменения

1 голос
/ 29 мая 2011

проверьте мой пост, который показывает оба метода java.swing.Timer # setDelay (int)

и

правильное использование Thread.sleep (int)

проблема с отображением курсора ожидания Java

...