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

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

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

HTML5の<canvas>要素用のタグです。CanvasはHTML5から導入された、二次元の図形描写が可能な要素です。

Java

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

Swing

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

解決済

repaintができない

cretter
cretter

総合スコア89

canvas

HTML5の<canvas>要素用のタグです。CanvasはHTML5から導入された、二次元の図形描写が可能な要素です。

Java

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

Swing

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

2回答

0評価

0クリップ

589閲覧

投稿2021/09/11 11:44

前提・実現したいこと

①のコードの実現したいことをざっくりまとめるとCanvasクラスで描写したボールを動かすコードです。
今、困っているのはGameクラス内のgoメソッドにあるrepaintが実行されないことです。
自分なりにpaintメソッド内にSystem.out.println();で出力してpaintが実行されているのか調べてみたのですが実行されていませんでした。
このURLを参考にして①のコードを作ったのですがimplements Runnableをしていないのが原因かと思い②のコードを作りました。
②のコードはrepaintをする部分だけ①に似せたものです。予想としては失敗するかと思ったのですが、実際は問題なく実行できました。
なぜ、①のコードでrepaintできないか教えてください。

①のソースコード

java

import javax.swing.*; import java.awt.*; import java.awt.event.*; import java.util.Random; public class Main{ public static void main(String[] args){ new Main(); } Main(){ Game f = new Game(); f.setVisible(true); try{ while(true){ long st = System.currentTimeMillis(); f.go(); long en = System.currentTimeMillis(); try{ Thread.sleep(1000/f.fps-(en-st)); }catch(Exception ex){ System.out.println("<Error> +"+((en-st)-1000/f.fps)+"ms"); } } }catch(Exception ex){ ex.printStackTrace(); } } } class Game extends JFrame implements MouseMotionListener{ int fps = 60; //一秒間に60回 int fx=500,fy=500; //フレームサイズ int centerX=fx/2,centerY=fy/2; //重力の位置 int renge = 100; MainCanvas mainc; Random r = new Random(); Game(){ setTitle("X = "+centerX+" : Y = "+centerX); setSize(fx+14,fy+37); setLocationRelativeTo(null); setLayout(new FlowLayout()); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); mainc = new MainCanvas(fx,fy,renge,5); add(mainc); addMouseMotionListener(this); //ここでframeにMouseMotionListenerを追加する。追加しないと使えない } void go(){ mainc.setCenter(centerX,centerY); mainc.go(); mainc.repaint(); System.out.println("go"); /* mainc.go(centerX,centerY); mainc.update(); */ //System.out.println("update"); } @Override public void mouseDragged(MouseEvent e) { //マウスがドラッグされたときに呼び出される。 mainc.reset(); //System.out.println("reset"); } @Override public void mouseMoved(MouseEvent e) { //マウスが動いたときに呼び出される。 centerX=e.getX()-7; centerX=e.getY()-30; setTitle("X = "+centerX+" : Y = "+centerX); } } class MainCanvas extends Canvas{ int count; double[] x,y; //位置 double rad;/* = Math.toRadians(0);*/ int fx,fy; //FrameXorY int size = 10; //玉の大きさ int memoryPower = 50; //勢いの残留回数 double[][] xPower,yPower; //勢いの保存 int renge; //重力目安 int centerX,centerY; Random r = new Random(); MainCanvas(int fx,int fy,int renge,int count){ this.fx=fx; this.fy=fy; this.renge=renge; this.count=count; x = new double[count]; y = new double[count]; xPower = new double[count][memoryPower]; yPower = new double[count][memoryPower]; for(int i=0;i<count;i++){ x[i] = r.nextInt(fx); y[i] = r.nextInt(fy); } //setBackground(Color.white); //repaint(); } //@Override public void paint(Graphics g){ System.out.println(3); //System.out.println("paint"); g.setColor(Color.black); for(int i=0;i<count;i++) g.fillOval((int)x[i],(int)y[i], size, size); } void go(){ System.out.println(2); for(int i=0;i<count;i++){ int heigth = centerY - getPY(i); int width = centerX - getPX(i); int power = (int)(Math.pow(heigth,2) + Math.pow(width,2)); rad = Math.atan2(heigth,width); keepPower(i,Math.cos(rad),Math.sin(rad),power); //setPower(i); } //repaint(); //setLocation((int) xy[0], (int) xy[1]); } int getPX(int a){ return (int)x[a]+size/2; } int getPY(int a){ return (int)y[a]+size/2; } void setPower(int a){ double interimX=0,interimY=0; for(int i=0;i<memoryPower;i++){ interimX+=xPower[a][i]; interimY+=yPower[a][i]; } x[a] += interimX/memoryPower; y[a] += interimY/memoryPower; } void keepPower(int a,double xp,double yp,int power){ double times = 3; //初期倍率 /* int interim = renge; while(power<(interim^2)){ times -= 0.1; if(times==0.1) break; renge*=2; } */ //System.out.println(power); for(int i=renge;i<power;i+=100){ times -= 0.005; //System.out.println(i); if(times<=0){ //System.out.println("break"); times=0.1; break; } } //System.out.println(times); for(int i=0;i<memoryPower;i++){ if(i<memoryPower-1){ xPower[a][i] = times * xp; yPower[a][i] = times * yp; break; } xPower[a][i] = xPower[a][i+1]; yPower[a][i] = yPower[a][i+1]; } } void reset(){ for(int i=0;i<count;i++){ x[i]=r.nextInt(fx); y[i]=r.nextInt(fy); } System.out.println("CanvasReset"); } void setCenter(int centerX,int centerY){ System.out.println(1); this.centerX=centerX; this.centerY=centerY; } }

###②のソースコード

java

import javax.swing.JFrame; import java.awt.*; import java.util.Random; public class EMoveBall{ int width, height; //縦横サイズ JFrame mainF; //フレーム Canvas mainC; //キャンバス public static void main(String[] args){ EMoveBall frame = new EMoveBall(); } EMoveBall(){ //サイズ設定して width = 500; height = 500; //キャンバスの大きさと背景色を指定 mainC = new MainCanvas(); mainC.setSize(200,200); mainC.setBackground(Color.blue); mainF = new JFrame("moving ball"); mainF.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); mainF.setBackground(Color.green); mainF.setSize(width,height); mainF.setLayout(new FlowLayout()); mainF.add(mainC); mainF.setVisible(true); while(true){ long st = System.currentTimeMillis(); //mainC.repaint(); go(); long en = System.currentTimeMillis(); try{ Thread.sleep(1000/60-(en-st)); }catch(Exception ex){ System.out.println("<Error> +"+((en-st)-1000/60)+"ms"); } } } void go(){ mainC.repaint(); } } class MainCanvas extends Canvas{ int count = 3; int[] x = new int[count]; int[] y = new int[count]; //ボールの位置 int vx = 1; //移動量 int vy = 1; //移動量 MainCanvas(){ Random r = new Random(); for(int i=0;i<count;i++){ x[i]=r.nextInt(50)+50; y[i]=r.nextInt(50)+50; } } public void paint(Graphics g){ System.out.println("paint"); for(int i=0;i<count;i++){ x[i] += vx; y[i] += vy; } g.setColor(Color.white); for(int i=0;i<count;i++) g.fillOval(x[i], y[i], 10, 10); } /* void update(){ System.out.println("update"); for(int i=0;i<count;i++){ x[i] += vx; y[i] += vy; } } */ }

補足情報(FW/ツールのバージョンなど)

java version "16.0.1" 2021-04-20
Java(TM) SE Runtime Environment (build 16.0.1+9-24)
Java HotSpot(TM) 64-Bit Server VM (build 16.0.1+9-24, mixed mode, sharing)

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

同じタグがついた質問を見る

canvas

HTML5の<canvas>要素用のタグです。CanvasはHTML5から導入された、二次元の図形描写が可能な要素です。

Java

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

Swing

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