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

前端 未结 3 738
抹茶落季
抹茶落季 2020-12-12 07:13
private class MultipleGensListener implements ActionListener
   {
    public void actionPerformed(ActionEvent e)
        {
            for(int i = 0; i < 25; i++)         


        
相关标签:
3条回答
  • 2020-12-12 07:30

    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

    0 讨论(0)
  • 2020-12-12 07:30

    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 讨论(0)
  • 2020-12-12 07:31

    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
          }
       }
    
    0 讨论(0)
提交回复
热议问题