質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Swing

SwingはJavaに標準で付属するグラフィック関連のクラスライブラリを指します。

while

Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

Javaアプレット

Javaアプレットは、Webページに組み込まれて実行されるJavaアプリケーションの形式です。Java SE 11で廃止となりました。

Q&A

解決済

1回答

1788閲覧

runメソッド内のrepaintが実行されない

railsganbaruman

総合スコア16

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Swing

SwingはJavaに標準で付属するグラフィック関連のクラスライブラリを指します。

while

Whileは多くの言語で使われるコントロール構造であり、特定の条件が満たされる限り一連の命令を繰り返し実行します。

Javaアプレット

Javaアプレットは、Webページに組み込まれて実行されるJavaアプリケーションの形式です。Java SE 11で廃止となりました。

1グッド

0クリップ

投稿2020/01/12 10:07

前提・実現したいこと

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が実行されない原因、解決策をご教授お願い致します。

TN8001👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

Java

1TileBasedGamePanel tbgp = new TileBasedGamePanel(); 2this.th = new Thread(tbgp);

新たにJPanelを作ってしまっては、呼ぶrepaintは表示されていない新しいJPanelのものです。

paintComponent内でThreadを作るのも意図しているように思えません。
repaintのたびにThreadが増えてしまいます。

Java

1import java.awt.Color; 2import java.awt.Graphics; 3import javax.swing.JFrame; 4import javax.swing.JPanel; 5 6public class Fall { 7 public static void main(String[] args) { 8 JFrame fr = new JFrame("TypeGame"); 9 fr.setSize(630, 750); 10 fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 11 fr.getContentPane().setBackground(Color.black); 12 TileBasedGamePanel panel = new TileBasedGamePanel(); 13 panel.setOpaque(false); 14 fr.add(panel); 15 fr.setVisible(true); 16 } 17} 18 19class TileBasedGamePanel extends JPanel implements Runnable { 20 private int paintX = 0; 21 private int paintY = 0; 22 private final double speed = 30; 23 private long deltTime = 0; 24 private Thread th; 25 26 TileBasedGamePanel() { 27 setFocusable(true); 28 this.th = new Thread(this); 29 th.start(); 30 } 31 32 @Override 33 protected void paintComponent(Graphics g) { 34// super.paintComponent(g); 35 g.setColor(Color.white); 36 g.drawOval(this.paintX, this.paintY, 50, 50); 37 System.out.println("paintComponentを呼びました"); 38 } 39 40 private boolean isExisted() { 41 return this.paintY < 750; 42 } 43 44 public void run() { 45 while (isExisted()) { 46 double secTime = this.deltTime / 1000.0; 47 this.paintY = (int) (this.speed * secTime); 48 long sleep = 50; 49 try { 50 Thread.sleep(sleep); 51 this.deltTime += sleep; 52 this.repaint(); 53 System.out.println("paintY:" + this.paintY); 54 System.out.println("deltTime:" + this.deltTime); 55 } catch (InterruptedException e) {} 56 } 57 System.out.println("runおわり"); 58 } 59}

投稿2020/01/12 11:59

TN8001

総合スコア9357

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

railsganbaruman

2020/01/12 16:40

ベストアンサーにさせていただきます。 多くの点で理解不足でした。 丁寧な解説ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問