Java, replacement for infinite loops?

前端 未结 9 727
花落未央
花落未央 2021-01-13 00:45

I am making a program that shows cellular growth through an array. I have gotten it so when I press the start button, the array updates every 10 seconds in a while(true){} l

相关标签:
9条回答
  • 2021-01-13 01:28

    Take a look at the wait() / notify() machinery. Briefly, a thread can wait for 10 seconds, but still be notified that an external event has occurred,

    0 讨论(0)
  • 2021-01-13 01:29

    What you need is use a Timer which changes the state of your component ( in this case the cellular growth ) and then call JComponent.repaint()

    This timer can be cancelled to make the pause and then to restart it, you just create a new one:

    So you could define the following two methods:

    private Timer timer;
    ...
    public void startPaiting() {
        timer = new Timer();
        timer.schedule( new TimerTask(){
            public void run(){
                changeState();
                repaint();
            }
        },0,  10000 ); // 10 s. 
    }
    
    public void pause(){
        timer.cancel();
    }
    

    And then in your "Pause/Resume" button invoke this "pause/startPaiting" methods:

    if( e.getActionCommand().equals("Pause")){
        growPanel.pause();
        setText("Resume");
    } else {
        growPanel.startPaiting();
        setText("Pause");
    }
    

    Here's the complete source code to see it running:

    import javax.swing.*;
    import java.awt.Graphics;
    import java.awt.Point;
    import java.awt.event.*;
    import java.util.Timer;
    import java.util.TimerTask;
    
    public class Grow {
    
        public static void main( String [] args ) {
            JFrame frame = new JFrame();
            final GrowPanel growPanel = new GrowPanel();
            frame.add( growPanel );
            frame.add( new JPanel(){{
                add( new JButton("Pause"){{
                    addActionListener( new ActionListener(){
                        public void actionPerformed( ActionEvent e ){
                            if( e.getActionCommand().equals("Pause")){
                                growPanel.pause();
                                setText("Resume");
                            } else {
                                growPanel.startPaiting();
                                setText("Pause");
                            }
                        }
                    });
            }});}}, java.awt.BorderLayout.SOUTH );
            frame.setSize( 400, 300 );
            frame.setVisible( true );
        }
    }
    
    class GrowPanel extends JComponent {
        private int x;
        private int y;
        private Timer timer;
        GrowPanel() {
            x = 10;
            y = 10;
            startPaiting();
        }
    
        public void startPaiting() {
            timer = new Timer();
            timer.schedule( new TimerTask(){
                public void run(){
                    changeState();
                    repaint();
                }
            },0,  100 ); // or 10000 which is 10 s. 
        }
    
        public void pause(){
            timer.cancel();
        }
    
        public void paintComponent( Graphics g ){
            g.fillOval( x, y, 10, 10 );
        }
        private void changeState(){
                x+=10;
                if( x >= 400 ) {
                    y+=10;
                    x = 0;
                }
                if( y >= 300 ){
                    y = 10;
                }
        }
    
    }
    
    0 讨论(0)
  • 2021-01-13 01:31

    I personally prefer using the Timer class rather than Thread or Thread.sleep(). The timer class handles both running the code periodically and canceling it.

    Your code would look like:

    TimerTask myTask = new TimerTask() {
      public void run() {
        // here goes my code
      }
    };
    
    Timer timer = new Timer();
    timer.schedule(myTask, 0 /*starts now*/, 10 * 1000 /* every 10 seconds */);
    
    // whenever you need to cancel it:
    timer.cancel();
    
    0 讨论(0)
提交回复
热议问题