前提・実現したいこと
java初心者です。
runメソッド内でwhile文を用いて、等速に図形が落下するプログラムを考えています。
発生している問題
run内部で変化していくy座標の計算を行い、計算終了ごとにrepaintを実行するようにしたいのですがpaintComponentが呼ばれていません。(paintComponent内のプリント出力がされていないことから判断)
該当のソースコード
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.;
public class Fall{
public static void main(String[] args) {
JFrame fr = new JFrame("TypeGame");
fr.setSize(630,750);
fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
fr.getContentPane().setBackground(Color.black);
TileBasedGamePanel panel = new TileBasedGamePanel();
panel.setOpaque(false);
fr.add(panel);
fr.setVisible(true);
}
}
class TileBasedGamePanel extends JPanel implements Runnable {
private int paintX,paintY=0;
private final double speed=30;
private long deltTime=(long)0;//ms
private Thread th;
TileBasedGamePanel() {
setFocusable(true);
}
public void paintComponent(Graphics g){
g.setColor(Color.white);
g.drawOval(this.paintX,this.paintY,50,50);
System.out.println("paintComponentを呼びました");
TileBasedGamePanel tbgp = new TileBasedGamePanel();
this.th = new Thread(tbgp);
th.start();
}
private boolean isExisted(){//paintYがフレーム上にあるか判定
if(this.paintY<750)return true;
return false;
}
public void run(){
while(isExisted()){
double secTime=this.deltTime/1000.;
this.paintY=(int)(this.speed(secTime));//m/s*s=m
long sleep=(long)50;//ms スレッドの停止時間
try{
this.th.sleep(sleep);
this.deltTime+=sleep;//経過時間を計算
this.repaint();
System.out.println("paintY:"+this.paintY);
System.out.println("deltTime:"+this.deltTime);
}catch(InterruptedException e){}
}
System.out.println("runおわり");
}
}
Java
repaintが実行されない原因、解決策をご教授お願い致します。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/01/12 16:40