Я новичок в Java, и я пытаюсь создать простую змеиную игру, но метод рисования получает только один раз и никогда больше, хотя поток продолжает работать. Я попробовал другое исправление на этом сайте, которое использовало другой класс, но это не сработало.repaint не работает в потоке
public class Snake extends JPanel implements Runnable {
boolean gamerunning = true;
int snake_x = 50, snake_y = 50, snake_dir = 2; //for snake_dir 1=up 2=right 3=down 4=left
int[] snake_xt, snake_yt;
public static void main(String args[]) {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(600,600);
frame.setVisible(true);
frame.add(new Snake());
(new Thread(new Snake())).start();
System.out.println("Running");
}
@Override
public void run() {
try {
while (gamerunning) {
Thread.sleep(500);
System.out.println(snake_x);
tick();
repaint();
}
} catch (InterruptedException e) {}
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
System.out.println("painting");
g.setColor(Color.black);
g.fillRect(snake_x, snake_y, 10,10);
}
public void tick() {
System.out.println("tick");
switch(snake_dir) {
case 1:
snake_y -= 10;
break;
case 2:
snake_x += 10;
break;
case 3:
snake_y += 10;
break;
case 4:
snake_x -= 10;
break;
}
}
}
Будьте carful с этим типом модели. Возможно, что компонент может быть в процессе окрашивания, когда вы обновляете значения, на которые он опирается ... – MadProgrammer
Ваша установка неверна: свойства компонента swing ** должны быть доступны в EDT - это правило применяется к пользовательские свойства (например, snake_x/y), как и для «обычных» свойств (например, фона). Вызов tick() из другого потока нарушает правило. – kleopatra