弹跳球不会暂停

时间:2018-11-24 11:15:19

标签: java swing

全部 我想做的是创建一个弹跳球Java程序。我做到了每次用户按下启动球时,屏幕上都会出现该球。我唯一的问题是我不知道如何暂停它。任何帮助,将不胜感激。我尝试添加类似于我执行addball功能的方式,但是不知道如何应用该功能来暂停球。我试图通过添加按钮暂停来实现puase功能,但是不知道如何使它起作用

BounceFrame:

                import java.awt.BorderLayout;
            import java.awt.Container;
            import java.awt.event.ActionEvent;
            import java.awt.event.ActionListener;

            import javax.swing.JButton;
            import javax.swing.JFrame;
            import javax.swing.JPanel;

            public class BounceFrame extends JFrame {

                private static final long serialVersionUID = 1L;
                private BallComponent ballComponent;

                public BounceFrame() {
                    setTitle("Bounce");
                    ballComponent = new BallComponent();
                    add(ballComponent, BorderLayout.CENTER);

                    JPanel buttonPanel = new JPanel();

            //      Adds more balls.
                    addButton(buttonPanel, "Start", new ActionListener() {
                        public void actionPerformed(ActionEvent ae) {
                            addBall();
                        }
                    });

                    addButton(buttonPanel, "Pause", new ActionListener() {
                        public void actionPerformed(ActionEvent ae) {

                        }
                    }); 

            //      Closes the panel.
                    addButton(buttonPanel, "Close", new ActionListener() {
                        public void actionPerformed(ActionEvent ae) {
                            System.exit(0);
                        }
                    });

                    add(buttonPanel, BorderLayout.SOUTH);
                    pack();
                }

                public void addButton(Container c, String title, ActionListener listener) {
                    JButton b = new JButton(title);
                    c.add(b);
                    b.addActionListener(listener);

                }

                public void addBall() {
                    Ball b = new Ball(ballComponent.getBounds());
                    RunnableBall rB = new RunnableBall(b, ballComponent);
                    Thread t = new Thread(rB);
                    t.start();

                }

            }

RunnableBall:

                import java.util.logging.Level;
            import java.util.logging.Logger;

            public class RunnableBall implements Runnable {
                 private Ball b;
                    private BallComponent comp;
                    private static final int DELAY = 3; //Controls speed of the balls.

                    public RunnableBall(Ball b, BallComponent comp)
                    {
                        this.b = b;
                        this.comp = comp;
                    }

                    @Override
                    public void run() {
                        comp.add(b);
                        while (true)
                        {
                            b.move(comp.getBounds());
                            comp.repaint();
                            try
                            {
                                Thread.sleep(DELAY);
                            }
                            catch (InterruptedException ex) {
                                Logger.getLogger(RunnableBall.class.getName()).log(Level.SEVERE, null, ex);
                            }
                        }
                    }

            }

1 个答案:

答案 0 :(得分:1)

添加球时,需要将要创建的RunnableBall对象存储在某个集合变量中,例如ArrayList<RunnableBall>类型的变量。然后,在“暂停”按钮的ActionListener中,您可以遍历ArrayList并在每个RunnableBall上调用一个暂停方法。

因此,您需要在pause内定义一个RunnableBall方法,该方法将布尔变量“ isPaused”设置为true。因此,您需要在isPaused类内创建变量RunnableBall,并使其更改run方法的行为。您应该能够弄清楚这一点。

您需要注意的一件事是,由于您正在使用多个线程,因此需要这些线程之间的通信(即,将isPaused变量设置为true或false)是线程安全的。我认为您可以通过将isPaused变量声明为volatile来实现这一点,但是还有其他方法可以实现。