我是Java的新手,我正在嘗試做一個簡單的蛇遊戲,但paint方法只會被調用一次,永遠不會再次運行,即使線程仍在運行。我嘗試了另一個修復這個網站,使用另一個類,但沒有奏效。重畫不能在線程中工作
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;
}
}
}
對這種類型的模型很熟悉。在更新其依賴的值時,組件可能正在被繪製過程中...... – MadProgrammer
您的設置不正確:必須在EDT上訪問擺動組件**的屬性 - 該規則適用於自定義屬性(如snake_x/y)與「普通」屬性(如背景)相同。從另一個線程調用tick()違反了規則。 – kleopatra