私は自分のバージョンの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);
}
}
フレームサイズを変更せずにrepaint()がトリガーされないのはなぜですか?私は相関を得ていますが、とにかくwhile(true)ループに入っているときに、なぜそれがなぜこのようなトリガーを必要とするのかは私には意味がありません。
私はここで何が欠けていますか? p.startと 削除スレッドオブジェクト 置き換えt.start()()
編集2:
編集1 追加new Thread(p).start();
、今それは働きます!ありがとう。
編集3:revalidate();
PlayGame p = new PlayGame(); スレッドt =新しいスレッド(p)。 t.start(); –
't.start()'ですが、 'p.start()'は決して使わないので、 'animate'は常に' false'です。 – kiheru
さて、これはスレッドオブジェクトが無意味であることを意味しますか? –