все Я пытаюсь создать 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);
}
}
}
}
Сжатый код, допустил ошибку, включив его все.
Используйте для анимации Качели таймера, а не Thread. Вы можете остановить / запустить таймер по мере необходимости.




Когда вы добавляете мяч, вам нужно сохранить объект RunnableBall, который вы создаете, в некоторой переменной коллекции, такой как, например, переменная типа ArrayList<RunnableBall>. Затем в ActionListener вашей кнопки паузы вы можете пройти через ArrayList и вызвать метод паузы на каждом из ваших RunnableBall.
Поэтому вам нужно будет определить метод pause внутри RunnableBall, который устанавливает для логической переменной isPaused значение true. Итак, вам нужно создать эту переменную isPaused внутри класса RunnableBall и заставить ее изменить поведение метода run. Вы должны уметь это понять.
Одна вещь, о которой вам нужно позаботиться, это тот факт, что, поскольку вы используете несколько потоков, вам понадобится связь между этими потоками (то есть процесс установки переменной isPaused на true или false), чтобы быть потокобезопасный. Я думаю, вы могли бы добиться этого, объявив переменную isPaused как volatile, но есть и другие способы сделать это.
Здесь слишком много кода по этому вопросу. Чтобы прояснить, в чем именно заключается ваша проблема, удалите любой код, который непосредственно не вызывает вашу проблему. См .: Как создать минимальный, полный и проверяемый пример и Как отлаживать небольшие программы.