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

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

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

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

Q&A

解決済

3回答

1011閲覧

Timerクラスとgraphicsクラスでアニメーションの作成

退会済みユーザー

退会済みユーザー

総合スコア0

Java

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

0グッド

0クリップ

投稿2022/11/17 17:51

編集2022/11/20 14:24

前提

Timerクラスを使って定期実行する描画のプログラミングを作りました。
デバックでだいぶ減らしたのですが、ここからどうすればいいのかわからなかったので教えてほしいです。
また、作ろうとしている動作が正常にできるかも判断してほしいです。描画のクラスは描画だけの時に動いたので問題ないと思います。

実現したいこと

正n角形を1秒ごとに正三角形から正n角形まで描画する。
角数が増えるごとに前の描画を消しています。

発生している問題・エラーメッセージ

PolygonTimer.java:20: エラー: 式の開始が不正です public void setI(){this.i++;} ^ PolygonTimer.java:22: エラー: <identifier>がありません System.out.print("How many squares do you want to draw?:"); ^ PolygonTimer.java:22: エラー: 型の開始が不正です System.out.print("How many squares do you want to draw?:"); ^ PolygonTimer.java:31: エラー: 型の開始が不正です if(i = n;){ ^ PolygonTimer.java:31: エラー: <identifier>がありません if(i = n;){ ^ PolygonTimer.java:31: エラー: 型の開始が不正です if(i = n;){

該当のソースコード

java

1import javax.swing.JFrame; 2import javax.swing.JPanel; 3import java.awt.Color; 4import java.awt.Graphics; 5import java.util.Timer; 6import java.util.TimerTask; 7import java.util.Scanner; 8 9class PolygonTimer{ 10 11 private int i = 3; 12 Scanner stdIn = new Scanner (System.in); 13 public static void main(String[] args){ 14 15 16 GameWindow gw = new GameWindow("circle and polygon",1000,1000); 17 gw.add(new DrawCanvas(i)); 18 gw.setVisible(true); 19 20 public void setI(){this.i++;} 21 22 System.out.print("How many squares do you want to draw?:"); 23 int n = stdIn.nextInt(); 24 Timer timer = new Timer(); 25 TimerTask task = new TimerTask(){ 26 27 public void run(){ 28 gw.DrawCanvas(3); 29 gw.setI(); 30 } 31 if(i = n;){ 32 timer.cancel();} 33 34 }; 35 36 public void start(){timer.schedule(task,1000,1000);} 37 38 39 } 40 41 42class DrawCanvas extends JPanel{ 43 44 public void paintComponent(Graphics g) { 45 super.paintComponent(g); 46 47 48g.clearRect(0,0,1000,1000); 49 50 int x0 = 500; 51 int y0 = 500; 52 int r = 400; 53 int x[] = new int[i]; 54 int y[] = new int[i]; 55 56 double delta = ( 2 *Math.PI )/ (double)i; 57 58 for(int l = 0; l<i; l++) { 59 x[l] = (int)(-Math.cos(Math.PI/2.0 + delta * l)*r) + x0; 60 y[l] = (int)(-Math.sin(Math.PI/2.0 + delta * l)*r) + y0; 61 } 62 63 g.setColor(Color.red); 64 g.drawPolygon(x, y, i); 65 i++; 66 67 } 68 69 public void paint(Graphics g) { 70 super.paint(g); 71 g.setColor(Color.blue); 72 g.drawOval(100, 100, 800, 800); 73 } 74 75 } 76 77class GameWindow extends JFrame{ 78 public GameWindow(String title, int width, int height) { 79 super(title); 80 setDefaultCloseOperation(EXIT_ON_CLOSE); 81 setSize(width,height); 82 setLocationRelativeTo(null); 83 setResizable(false); 84 85 } 86} 87

試したこと

ここに問題に対して試したことを記載してください。

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

ここにより詳細な情報を記載してください。

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

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

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

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

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

jimbe

2022/11/17 18:52 編集

デバッグしてください、ということでしょうか。 (コンパイルエラーを取るのはデバッグ以前ですが。) 少なくとも、メソッドの中にメソッドの定義があるのをおかしいと思えないのでは、基本が分かっていないようにしか見えません。
退会済みユーザー

退会済みユーザー

2022/11/17 18:56 編集

学校の課題で授業ペースが早く、自分でもよくわかっていない状態で難しいものに手を出してしまった状態です、、、申し訳ないです、、 提出が近いのでその場しのぎで書いてもらって後から勉強したいです おこがましいですが想像しているように直してもらうことは可能でしょうか
m.ts10806

2022/11/17 20:03

作業依頼や課題代行に応える場ではないので、きっちり怒られるか、先生や同級生に聞くしかないと思います。
m.ts10806

2022/11/17 20:11 編集

ひとまずセミコロンは基本的に「文章としての終端」なので、「構文」として成り立たせるのなら、置いていいかどうかというのは考えてみてください。(つまりはエラーの通りということです) =は代入で==は比較 ただ、さすがにこれを教えない先生も教科書もないはずなので、やりたいことの前に基礎を復習した方が結果的には早く進みますよ。ここで後回しにしてしまうと、ずっと後回しになって永遠に手に付けられることはないと思ってください。人間って楽な方に流れるような頭になってます。
TN8001

2022/11/17 20:29

↓の質問をしたBiginnerさんですか?(後半部分が全く同じです) [javaで正多角形の描画のプログラムをやっています。正n角形のnの部分を入力するところでつまずいています。](https://teratail.com/questions/5dy91ppgg7ybxn) もしそうであれば利用規約違反です。 [利用規約](https://teratail.com/legal) 同じ学校の別人あるいは先の質問を参考にした、ということであればすいません。
dodox86

2022/11/17 22:17

一体どこの学校なのか。課題をこなした後はもうきっとプログラミングはしないのでしょうね。
退会済みユーザー

退会済みユーザー

2022/11/17 22:24

意見ありがとうございます。 現状進んだところで提出し、テストが終わってからゆっくりプログラミングを勉強しなおそうと思います。これからも何度か修正していくので変身していただけると助かります。 TN8001さんの返答としては、前つかっていたアカウントのパスワード等を忘れてしまい、新しくアカウントを作っていました。そうとは知らず申し訳ございません。
m.ts10806

2022/11/17 23:04

ログイン画面に「パスワードを忘れた方はこちら」が見やすい位置にあるので、そこで新しいアカウントを作ろうという思考に飛んでしまうのはちょっと改めたほうが良いかと。
dodox86

2022/11/17 23:10

それにしても前のご質問の投稿は今から2ヶ月以上前ですね。私はこれにて離脱します。
jimbe

2022/11/18 02:50

課題に既視感を感じたのはそういうことでしたか。
退会済みユーザー

退会済みユーザー

2022/11/18 03:10

友達に教えてもらいながら解決することができました。描画するクラスをタイマータスク内で実行することで解決しました。インスタンス化では処理に飛ばないと勘違いしていたのが遠回りした原因でした。 たくさんの意見ありがとうございました。これからの勉強に役立てたいと思います。
jimbe

2022/11/18 03:21

>友達に教えてもらいながら 何よりこれが一番ですね。
TN8001

2022/11/18 03:33

> 前つかっていたアカウントのパスワード等を忘れてしまい、新しくアカウントを作っていました。 それはいけませんね。 このページの下部のヘルプから、パスワード再設定フォームに飛べます。 多分動いていると思いますが、返信がなかったりうまくいかない場合は直接「お問い合わせ」してください。 [ヘルプ | パスワードを忘れてしまった](https://teratail.com/help#forget-password) [パスワード再設定リクエストを送る](https://teratail.com/login/forget) [運営へのお問い合わせ](https://teratail.com/contact/input) 復旧しましたら質問を「解決済」にしたうえで、古いアカウントのほうは速やかに退会手続きをしてください。 [ヘルプ | 退会したい](https://teratail.com/help#about-chancel) [退会申請](https://teratail.com/users/setting/leave)
退会済みユーザー

退会済みユーザー

2022/11/19 02:36

了解しました。回答も含めて最後までありがとうございました。
guest

回答3

0

小さくしています。

PolygonTimer.java

java

1import java.awt.*; 2import java.awt.event.ComponentAdapter; 3import java.awt.event.ComponentEvent; 4import java.util.Scanner; 5import java.util.Timer; 6import java.util.TimerTask; 7 8import javax.swing.*; 9 10public class PolygonTimer extends JFrame { 11 public static void main(String[] args) { 12 int n = input(); 13 SwingUtilities.invokeLater(() -> new PolygonTimer(n).setVisible(true)); 14 } 15 16 private static int input() { 17 int n = 0; 18 try(Scanner scanner = new Scanner(System.in)) { 19 do { 20 System.out.print("How many squares do you want to draw?:"); 21 n = scanner.nextInt(); 22 } while(n < 3 || 999 < n); 23 } 24 return n; 25 } 26 27 PolygonTimer(int n) { 28 super("Circle and Polygon"); 29 setDefaultCloseOperation(EXIT_ON_CLOSE); 30 setSize(300, 300); 31 //setLocationRelativeTo(null); 32 33 add(new DrawCanvas(n)); 34 } 35} 36 37class Circle { 38 private int x, y, w, h; 39 40 Circle(int x0, int y0, int r) { 41 x = x0 - r; 42 y = y0 - r; 43 w = h = r * 2; 44 } 45 46 void paint(Graphics2D g2) { 47 g2.setColor(Color.blue); 48 g2.drawOval(x, y, w, h); 49 } 50} 51 52class Polygon { 53 private int n, x[], y[]; 54 55 Polygon(int x0, int y0, int r, int n) { 56 if(n < 3) throw new IllegalArgumentException("n は 3 以上でなければならない. n="+n); 57 this.n = n; 58 59 double delta = (2 * Math.PI) / n; 60 x = new int[n]; 61 y = new int[n]; 62 for(int i=0; i<n; i++) { 63 x[i] = (int)(-Math.cos(Math.PI / 2 + delta * i) * r) + x0; 64 y[i] = (int)(-Math.sin(Math.PI / 2 + delta * i) * r) + y0; 65 } 66 } 67 68 void paint(Graphics2D g2) { 69 g2.setColor(Color.red); 70 g2.drawPolygon(x, y, n); 71 } 72} 73 74class DrawCanvas extends JPanel { 75 private int numberOfVertices = 3, max; 76 private Circle circle; 77 private Polygon polygon; 78 79 DrawCanvas(int max) { 80 if(max < 3) throw new IllegalArgumentException("max error"); 81 this.max = max; 82 83 addComponentListener(new ComponentAdapter() { 84 @Override 85 public void componentResized(ComponentEvent e) { 86 createDrawingObjects(); 87 } 88 }); 89 90 Timer timer = new Timer(); 91 timer.schedule(new TimerTask(){ 92 public void run(){ 93 if(countUp()) { 94 timer.cancel(); 95 return; 96 } 97 createDrawingObjects(); 98 repaint(); 99 } 100 }, 1000, 1000); 101 } 102 103 private void createDrawingObjects() { 104 int x0 = getWidth() / 2; 105 int y0 = getHeight() / 2; 106 int r = (int)(Math.min(x0, y0) * 0.8); 107 int n = numberOfVertices; 108 circle = new Circle(x0, y0, r); 109 polygon = new Polygon(x0, y0, r, n); 110 } 111 112 private boolean countUp() { 113 if(numberOfVertices >= max) return true; //終わり 114 numberOfVertices++; 115 return false; 116 } 117 118 @Override 119 public void paintComponent(Graphics g) { 120 super.paintComponent(g); 121 122 Graphics2D g2 = (Graphics2D)g; 123 g2.setStroke(new BasicStroke(10)); 124 if(circle != null) circle.paint(g2); 125 if(polygon != null) polygon.paint(g2); 126 } 127}

plain

1How many squares do you want to draw?:8

実行結果(アニメーション終了時)

投稿2022/11/20 05:24

jimbe

総合スコア12545

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

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

0

Timerクラスを使って定期実行する描画のプログラミングを作りました。

Swingではjava.util.Timerではなく、javax.swing.Timerを使用してください。
Timer (Java Platform SE 8 )

デバックでだいぶ減らしたのですが、ここからどうすればいいのかわからなかったので教えてほしいです。

メソッドの中にメソッドが書かれていたりif文すら正しく書けないとなると、もう一度基本から復習されたほうがいいと思います。

また、作ろうとしている動作が正常にできるかも判断してほしいです。

どういうことでしょうか?
出来るか出来ないかでいえば、思いつくことは大体できるでしょう。

描画のクラスは描画だけの時に動いたので問題ないと思います。

細かくクラスを分けるのがJavaっぽいのでしょうが、極力シンプルに1クラスだけにしました。

Java

1import javax.swing.*; 2import java.awt.Color; 3import java.awt.Graphics; 4import java.awt.event.ActionEvent; 5import java.awt.event.ActionListener; 6import java.util.Scanner; 7 8public class DrawCanvas extends JPanel implements ActionListener { 9 public static void main(String[] args) { 10 // 正n角形 最大値取得 11 Scanner scanner = new Scanner(System.in); 12 int max; 13 while (true) { 14 System.out.print("正何角形まで描きますか?3-999:"); 15 try { 16 max = scanner.nextInt(); 17 if (3 <= max && max <= 999) break; 18 } catch (Exception ignored) { scanner.next(); } // 不正入力スキップ 19 } 20 21 // JFrame(ウィンドウ)の準備 22 JFrame frame = new JFrame("正多角形"); 23 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 24 frame.setSize(1000, 1000); 25 frame.setLocationRelativeTo(null); 26 frame.add(new DrawCanvas(max)); // 最大値をコンストラクタ引数で渡す 27 frame.setVisible(true); 28 } 29 30 private final int max; // 正n角形 最大値 31 private int n = 3; // 正n角形 現在値 32 33 public DrawCanvas(int m) { // コンストラクタ 34 max = m; // 引数をフィールドに保存 35 setBackground(Color.WHITE); // 背景 白 36 new Timer(1000, this).start(); // タイマースタート! 37 } 38 39 @Override public void actionPerformed(ActionEvent e) { // 1秒おきに呼ばれる 40 n++; 41 if (max < n) n = 3; 42 repaint(); // 再描画 43 } 44 45 @Override public void paintComponent(Graphics g) { // 描画が必要になったとき呼ばれる 46 super.paintComponent(g); 47 48 // ウィンドウリサイズ対応 49 int x0 = getWidth() / 2; 50 int y0 = getHeight() / 2; 51 int r = Math.min(x0, y0) / 5 * 4; 52 53 int[] x = new int[n]; 54 int[] y = new int[n]; 55 double delta = 2 * Math.PI / n; 56 57 for (int i = 0; i < n; i++) { 58 x[i] = (int) (Math.cos(-Math.PI / 2 + delta * i) * r) + x0; 59 y[i] = (int) (Math.sin(-Math.PI / 2 + delta * i) * r) + y0; 60 } 61 g.setColor(Color.RED); 62 g.drawPolygon(x, y, n); 63 } 64}

タイマーの使い方はご理解いただけたかと思います(簡単ですよね?)

クラスを3つ使うのが必須条件なのかもしれませんが、(課題ということなので)答えをそのまま書く気はありません。
元々の動いていたコードにタイマー部分を追加するか、回答コードを3つに分割してください^^;

Java

1public class PolygonTimer { 2 public static void main(String[] args) { 3// mainを多少修正 4 } 5} 6 7class DrawCanvas extends JPanel implements ActionListener { 8// main以外の全部 9} 10 11class GameWindow extends JFrame { 12// そのまま 13}

投稿2022/11/18 03:33

TN8001

総合スコア9244

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

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

jimbe

2022/11/18 04:03

確か repaint は EDT 外からでも動作するとなっていたと思いますので、 java.util.Timer でも良いように思います。(心配事は増えますけども。)
TN8001

2022/11/18 04:56

今回の内容(repaintを呼ぶだけ)ならどのタイマーでも問題ないということですね。 > (心配事は増えますけども。) 精度(遅延)を気にする必要がなければ、javax.swing.Timerが無難ですね^^
jimbe

2022/11/18 06:23

厳しい条件なら遅延も問題ですが、普通にマルチスレッドになりますので、コンポーネントのフィールド(DrawCanvas.n)の更新のアトミック性とか、そのフィールドを何度も直接使用する場合に途中で変更されることへの考慮(paintComponent 中に n が変更されたら?)とかもですね。
guest

0

ベストアンサー

import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.Color;
import java.awt.Graphics;
import java.util.TimerTask;
import java.util.Scanner;
import java.util.Timer;
import java.util.TimerTask;
import java.text.ParseException;

class Polygonauto {

public static void main(String[] args)throws ParseException{ GameWindow gw = new GameWindow("円と正多角形",1000,1000); Scanner stdIn = new Scanner(System.in); System.out.print("正n角形までの描画 nを入力:"); int n = stdIn.nextInt() + 1; Timer timer = new Timer(false); TimerTask task = new TimerTask() { int cnt=3; @Override public void run() { gw.add(new DrawCanvas(cnt)); gw.setVisible(true); cnt++; if( cnt >= n ) timer.cancel(); } }; timer.schedule(task, 0, 500); }

}

class DrawCanvas extends JPanel{
private int n;

DrawCanvas(int n){
this.n = n;
}

public void paintComponent(Graphics g) {
super.paintComponent(g);

int x0 = 500;
int y0 = 500;
int r = 400;
int x[] = new int[n];
int y[] = new int[n];

double delta = ( 2 *Math.PI )/ (double)n;

for(int l = 0; l<n; l++) {
x[l] = (int)(-Math.cos(Math.PI/2.0 + delta * l)*r) + x0;
y[l] = (int)(-Math.sin(Math.PI/2.0 + delta * l)*r) + y0;
}

g.setColor(Color.red);

g.drawPolygon(x, y, n);

}

public void paint(Graphics g) { super.paint(g);

g.setColor(Color.blue);
g.drawOval(100, 100, 800, 800);
}

}

class GameWindow extends JFrame{
public GameWindow(String title, int width, int height) {
super(title);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setSize(width,height);
setLocationRelativeTo(null);
setResizable(false);

}
}

投稿2022/11/18 03:07

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

jimbe

2022/11/18 10:45 編集

質問のコードのように、コードのマークダウンを利用して頂けると読み易くなって助かります。 paint を override して行っている青丸の描画は、 paintComponent の最後で行っても同じです。 swing は AWT と違い (paint では無く ) paintComponent を override する方針ですので、 paint から移動させて paint は削除したほうが良いです。 また、 TN8001 さんが回答での指摘や、私もそのコメントに少し書かせて頂きましたが、 Swing は java.util.Timer とは別に動作します。 Swing のコンポーネントが最初に表示状態になって以降、 Swing の EDT(イベントディスパッチスレッド) 以外から操作することは、一部ドキュメントで言及されていること以外は動作が保証されない行為です。 こちらのコードでは TimerTask での gw.add(new DrawCanvas(cnt)) がそれに当たります。 一応動作しているようですので課題としては OK が出るかもしれませんが、 Swing としては『あと少し』と思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問