我正在嘗試爲學習目的製作自己的Snake版本。一切似乎工作正常,但如果我想要我的框架重新粉刷,我必須手動調整我的窗口。這裏是我的代碼:只有在調整窗口大小後才能更新JFrame
package snake;
import java.awt.*;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class PlayGame extends JPanel implements Runnable{
public boolean animate = false;
public final int FRAME_DELAY = 750;
PickupBall b = new PickupBall();
Snake bob = new Snake();
public synchronized void start() {
animate = true;
}
public synchronized void stop() {
animate = false;
}
private synchronized boolean animationEnabled() {
return animate;
}
@Override
public void run(){
while(true){
if (animationEnabled()){
repaint();
}
try {
Thread.sleep(FRAME_DELAY);
}
catch (InterruptedException e) {
throw new RuntimeException(e);
}
}
}
@Override
public void paintComponent(Graphics g){
super.paintComponent(g);
b.draw(g);
bob.draw(g);
}
public static void main(String[] args) {
JFrame jfr = new JFrame("Snake");
jfr.setSize(640,640);
jfr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jfr.setResizable(true);
PlayGame p = new PlayGame();
jfr.setContentPane(p);
p.setBackground(Color.WHITE);
p.start();
new Thread(p).start();
jfr.setVisible(true);
}
}
爲什麼不重繪()觸發沒有改變幀的大小?我得到了相關性,但是它對於爲什麼當它處於while(true)循環時需要這樣的觸發器是沒有意義的。
我在這裏錯過了什麼?
編輯1: 刪除線程對象 替換t.start()與p.start()
編輯2: 新增new Thread(p).start();
和現在的作品!謝謝。
編輯3: 刪除revalidate();
PlayGame p = new PlayGame(); 線程t =新線程(p); t.start(); –
't.start()',但從來沒有'p.start()',所以'animate'總是'false'。 – kiheru
好吧,這是否意味着線程對象是毫無意義的? –