Прыгающие шары не останавливаются

все Я пытаюсь создать 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);
                            }
                        }
                    }

            }

Здесь слишком много кода по этому вопросу. Чтобы прояснить, в чем именно заключается ваша проблема, удалите любой код, который непосредственно не вызывает вашу проблему. См .: Как создать минимальный, полный и проверяемый пример и Как отлаживать небольшие программы.

Joe C 24.11.2018 12:20

Сжатый код, допустил ошибку, включив его все.

user9264468 24.11.2018 12:30

Используйте для анимации Качели таймера, а не Thread. Вы можете остановить / запустить таймер по мере необходимости.

camickr 24.11.2018 15:58
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
3
166
1

Ответы 1

Когда вы добавляете мяч, вам нужно сохранить объект RunnableBall, который вы создаете, в некоторой переменной коллекции, такой как, например, переменная типа ArrayList<RunnableBall>. Затем в ActionListener вашей кнопки паузы вы можете пройти через ArrayList и вызвать метод паузы на каждом из ваших RunnableBall.

Поэтому вам нужно будет определить метод pause внутри RunnableBall, который устанавливает для логической переменной isPaused значение true. Итак, вам нужно создать эту переменную isPaused внутри класса RunnableBall и заставить ее изменить поведение метода run. Вы должны уметь это понять.

Одна вещь, о которой вам нужно позаботиться, это тот факт, что, поскольку вы используете несколько потоков, вам понадобится связь между этими потоками (то есть процесс установки переменной isPaused на true или false), чтобы быть потокобезопасный. Я думаю, вы могли бы добиться этого, объявив переменную isPaused как volatile, но есть и другие способы сделать это.

Другие вопросы по теме