开发者

How do I make this java for loop pause for 1/2 a second between each iteration?

开发者 https://www.devze.com 2023-03-08 21:41 出处:网络
private class MultipleGensListener implements ActionListener { public void actionPerformed(ActionEvent e)
private class MultipleGensListener implements ActionListener
   {
    public void actionPerformed(ActionEvent e)
        {
            for(int i = 0; i < 25; i++)
            {
      开发者_运维问答          game.runSimulationOneGen();
                changeGrid();
            }
        }
   }

//this is the loop. The changeGrid method displays a game grid on a GUI but // only the 25th iteration is visible on screen. I would like each one to be // visible for about a half a second before the loop continues. // I have seen some questions answered on here that are very close to what I'm asking, // but I just don't really understand how to apply it to my program.. // thanks for any help.


If the code performed by the simulation is quick and does not consume too much CPU and time, then consider using a Swing Timer to do your looping and delay. Otherwise, you'll need to use a background thread such as can be done with a SwingWorker object.

For e.g. if using both Swing Timer and 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
      }
   }


NEVER BLOCK THE GUI EVENT THREAD

you can use a timer for that and have it only fire 25 times

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();

btw the reason only the last iteration is shown is that gui updates (redraws) are done in a separate event, but to let another event trigger you need to return from the listener method which you didn't

the Timer I showed is a more elaborate iteration which lets other events run in between iterations allowing the gui to show the changes


check my post that shows both methods java.swing.Timer#setDelay(int)

and

correct usage of Thread.sleep(int)

java wait cursor display problem

0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号