Итак, чтобы сломать ваш код:
Когда кнопка нажата, вы выполняете следующий код:
Image ball = null;
new Layout().createEllipse(ball);
runnable = new Layout();
move = new Thread(runnable);
move.start();
Это создаст новый макет.Метод run()
этого увеличит переменные X
и Y
.Они объявлены здесь:
int X,Y; //Coordenadas
Это переменные экземпляра, это означает, что они принадлежат только что созданному вами Layout
.
Затем вы вызываете repaint()
для нового Layout
,который ничего не будет делать, потому что этот новый макет не был добавлен в какое-то окно.
Итак, как вы можете это исправить?
Во-первых, вы должны сохранить исходный Layout
:
class Animation extends JFrame { // no need to implement ActionListener
Rectangle2D dimensions = new Rectangle2D.Double(0,0,850,595); //Not implemented limits
JButton animate, stop;
Thread move;
Layout layout;
Затем запомните макет при его создании:
// before: add(new Layout());
layout = new Layout();
add(layout);
Затем используйте макет в вашем ActionListener
:
layout.createEllipse(ball);
move = new Thread(layout);
move.start();
Это может иметь некоторыепроблемы с параллелизмом (Swing не является потокобезопасным), поэтому для правильной меры вы должны вызвать repaint()
в AWTEventThread:
// in run(), was repaint():
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
repaint();
}
});
Теперь осталось выполнить несколько задач очистки:
Удалить этокод:
@Override
public void actionPerformed(ActionEvent e) {} //Tag
Больше не нужен, потому что вы не реализуете ActionListener
.
Удалите модификаторы static
из некоторых полей и добавьте volatile
:
volatile int X,Y; //Coordenadas
volatile boolean running = true; //"To interrupt the thread" momentaneously.
ArrayList<Image> balls = new ArrayList<>(); //Balls collection
volatile
требуется для переменных, доступ к которым осуществляется из более чем одного потока.
Также удалите repaint()
и resetUI()
из метода paint
.Они вам не нужны.
Для изображений в paint
: вы должны их кешировать.Храните их в поле, чтобы вам не приходилось каждый раз загружать картинку.
Когда все это будет сделано, ваш код станет намного чище, но все же есть некоторые проблемы, с которыми нужно бороться.Но, по крайней мере, у вас что-то работает.