Делаю анимацию с классом Thread, метод run наследника runnable почему-то вызывается один раз
Пыталась сделать анимацию с помощью многопоточности, но сообщение из метода run наследника класса Runnable выводится только один раз, в картинке заметных изменений не наблюдается, хотя вроде бы запустила поток как в документации. Он закрывается или проблема в чём-то другом?
import javax.swing.*;
public class Window extends JFrame {
public Window() {
setSize(600, 600);
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
Panel pl = new Panel(getWidth(), getHeight());
add(pl);
Thread t = new Thread(pl);
t.start();
pl.repaint();
setVisible(true);
}
}
import javax.swing.*;
import java.awt.*;
public class Panel extends JPanel implements Runnable {
private int width, height;
public double k;
public Panel(int width, int height) {
this.width = width;
this.height = height;
k=0;
}
@Override
public void paint(Graphics g) {
super.paint(g);
g.setColor(Color.black);
g.drawLine(250, 200, 250, 350);
g.setColor(Color.green);
g.fillPolygon(new int[]{150, 400, 350, 200}, new int[]{350, 350, 450, 450}, 4);
g.fillPolygon(new int[]{250, 350, 250}, new int[]{200, 280, 325}, 3);
g.setColor(Color.blue);
int[] xPoly = new int[width];
for(int i=0; i<width; ++i)
{
xPoly[i]=i;
}
int[] yPoly = setSin();
g.fillPolygon(xPoly, yPoly, width);
g.setColor(Color.YELLOW);
g.fillOval(width-100, -100, 200, 200);
if(true)
{
}
}
private int[] setSin()
{
int[] yPoly = new int[width];
yPoly[0]=width;
yPoly[width-1]=width;
for(int i=1; i<width-1; ++i)
{
yPoly[i]=400-(int)(20*(Math.sin((double)(i)/40+k*20)));
}
System.out.println("py") ;
return yPoly;
}
@Override
public int getWidth() {
return width;
}
@Override
public void run() {
try {
Thread.sleep(1000);
System.out.print("run");
if(k==500)
k=0;
++k;
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
Ответы (1 шт):
Автор решения: Roman Konoval
→ Ссылка
Поток выполняет метод run один раз и если метод run закончил выполнение, то поток заканчивает свою роботу. Это обычное поведение.
Если вам нужно чтоб поток продолжал работу и делал что-то полезное, то нужно в методе run сделать цикл.