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

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

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

Java Development Kit(JDK)とは、Javaでの開発のために要するソフトウェアをまとめたパッケージです。コンパイラの「Javac」やクラスライブラリの「jar」など、Java開発者向けツールが含まれています。

JFrame

JFrameはJFC/Swingフレームワークのコンポーネントであり、トップレベルのコンテナです。

Java

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

Q&A

1回答

1583閲覧

javaで正多角形の描画のプログラムをやっています。正n角形のnの部分を入力するところでつまずいています。

Biginner

総合スコア0

Java Development Kit

Java Development Kit(JDK)とは、Javaでの開発のために要するソフトウェアをまとめたパッケージです。コンパイラの「Javac」やクラスライブラリの「jar」など、Java開発者向けツールが含まれています。

JFrame

JFrameはJFC/Swingフレームワークのコンポーネントであり、トップレベルのコンテナです。

Java

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

0グッド

0クリップ

投稿2022/09/14 18:33

編集2022/09/15 08:08

前提

javaで正多角形の描画のプログラムをやっています。正n角形のnの部分を入力するところでつまずいています。

実現したいこと

static Scanner stdIn = new Scanner(System.in);
System.out.println("正何角形?:");
static int n = stdIn.nextInt();
の部分で正多角形のnを入力してから、描画に移るプログラミングがしたいです。
n=9;などと置いてから実行した場合はできました。

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

Exception in thread "main" java.lang.NoSuchMethodError: 'void DrawCanvas.<init>(int)' at Test2.main(Test1.java:29)

該当のソースコード

該当の言語

Java

1import javax.swing.*; 2import java.awt.Color; 3import java.awt.Graphics; 4import java.util.Scanner; 5 6public class Test1 { 7 8 public static void main(String[] args){ 9 Scanner stdIn = new Scanner(System.in); 10 int n; 11 12 while (true) { 13 System.out.println("正何角形?(3-999):"); 14 try { 15 n = stdIn.nextInt(); 16 if (3 <= n && n <= 999) break; 17 } catch (Exception ignored) { stdIn.next(); } 18 } 19 20 21 double a = n; 22 double b = 180/a; 23 double m = Math.toRadians(b); 24 double l = a*(Math.sin(m)); 25 System.out.println("正"+n+"角形の円周率の近似:"+l); 26 27 28 GameWindow gw = new GameWindow("円と正多角形",1000,1000); 29 gw.add(new DrawCanvas(n)); 30 gw.setVisible(true); 31 32 } 33} 34 35class DrawCanvas extends JPanel{ 36 private int n; 37 public DrawCanvas(int n) { 38 this.n = n; 39 SpinnerNumberModel model = new SpinnerNumberModel(n, 3,999, 1); 40 JSpinner spinner = new JSpinner(model); 41 spinner.addChangeListener(e -> { 42 this.n = (int) spinner.getValue(); 43 repaint(); 44 }); 45 add(spinner); 46 } 47 48 49 50 @Override public void paintComponent(Graphics g) { 51 super.paintComponent(g); 52 53 int x0 = 500; 54 int y0 = 500; 55 int r = 400; 56 int x[] = new int[n]; 57 int y[] = new int[n]; 58 59 double delta = 2 * ( Math.PI /(double)n ); 60 61 for(int i= 0; i<n; i++) { 62 x[i] = (int)(Math.cos(-Math.PI/2.0 + delta * i)*r) + x0; 63 y[i] = (int)(Math.sin(-Math.PI/2.0 + delta * i)*r) + y0; 64 } 65 g.setColor(Color.red); 66 g.drawPolygon(x, y, n); 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 76class GameWindow extends JFrame{ 77 public GameWindow(String title, int width, int height) { 78 super(title); 79 setDefaultCloseOperation(EXIT_ON_CLOSE); 80 setSize(width,height); 81 setLocationRelativeTo(null); 82 setResizable(false); 83 84 } 85}

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

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

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

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

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

m.ts10806

2022/09/14 23:34

まず構文エラー直してビルドできるようになってからでないとスタートラインにすら立てないと思います
TN8001

2022/09/22 08:58

> TN8001さんの修正内容で変更したところ次のようなエラーが出ました。TN8001さんのコードでも同じエラーが出ました。 気が付いていませんでした。すいません。 回答への返答・疑問等は、回答のコメント欄にお願いします。 質問を編集したことは**回答者には通知されません** [編集した事を回答者にも通知したい | ヘルプ](https://teratail.com/help#notify-editing) 「質問への追記・修正依頼」をした人・低評価をした人には通知されます。 > Exception in thread "main" java.lang.NoSuchMethodError: 'void DrawCanvas.<init>(int)' > at Test2.main(Test1.java:29) DrawCanvasのコンストラクタ「public DrawCanvas(int n){}」が見つからないと言っています。 どういう環境でどうコンパイルしどう実行しましたか? 手元のIDE(IntelliJ IDEA)では問題なく実行できました。
guest

回答1

0

そこにstaticは書けません。
閉じかっこ(})もひとつ多いです。
そもそもmainはひとつしか実行されません。

Test2mainの最初で入力を受け付けて、nDrawCanvasのコンストラクタで渡せばいいんじゃないですかね。

Java

1import javax.swing.*; 2import java.awt.Color; 3import java.awt.Graphics; 4import java.util.Scanner; 5 6public class Test2 { 7 public static void main(String[] args) { 8 Scanner scanner = new Scanner(System.in); 9 int n; 10 while (true) { 11 System.out.println("正何角形?3-20:"); 12 try { 13 n = scanner.nextInt(); 14 if (3 <= n && n <= 20) break; 15 } catch (Exception ignored) { scanner.next(); } 16 } 17 18 GameWindow gw = new GameWindow("円と正多角形", 1000, 1000); 19 gw.add(new DrawCanvas(n)); 20 gw.setVisible(true); 21 } 22} 23 24class DrawCanvas extends JPanel { 25 private int n; 26 27 public DrawCanvas(int n) { 28 this.n = n; 29 30 SpinnerNumberModel model = new SpinnerNumberModel(n, 3, 20, 1); 31 JSpinner spinner = new JSpinner(model); 32 spinner.addChangeListener(e -> { 33 this.n = (int) spinner.getValue(); 34 repaint(); 35 }); 36 add(spinner); 37 } 38 39 @Override public void paintComponent(Graphics g) { 40 super.paintComponent(g); 41 42 int x0 = getWidth() / 2; 43 int y0 = getHeight() / 2; 44 int r = Math.min(x0, y0) / 5 * 4; 45 46 g.setColor(Color.BLUE); 47 g.drawOval(x0 - r, y0 - r, r * 2, r * 2); 48 49 50 int[] x = new int[n]; 51 int[] y = new int[n]; 52 double delta = 2 * Math.PI / n; 53 54 for (int i = 0; i < n; i++) { 55 x[i] = (int) (Math.cos(-Math.PI / 2.0 + delta * i) * r) + x0; 56 y[i] = (int) (Math.sin(-Math.PI / 2.0 + delta * i) * r) + y0; 57 } 58 g.setColor(Color.RED); 59 g.drawPolygon(x, y, n); 60 } 61} 62 63class GameWindow extends JFrame { 64 public GameWindow(String title, int width, int height) { 65 super(title); 66 setDefaultCloseOperation(EXIT_ON_CLOSE); 67 setSize(width, height); 68 setLocationRelativeTo(null); 69 } 70}

通常GUIプログラムではコンソール入出力は使用しません。
UI部品(コンポーネント)を使って、簡単に操作できるようにしましょう。


追記
1クラスにまとめました。これなら間違いなく実行できるでしょう^^

Java

1import javax.swing.*; 2import java.awt.Color; 3import java.awt.Graphics; 4import java.util.Scanner; 5 6public class Test1 extends JPanel { 7 public static void main(String[] args) { 8 Scanner stdIn = new Scanner(System.in); 9 int n; 10 while (true) { 11 System.out.println("正何角形?3-999:"); 12 try { 13 n = stdIn.nextInt(); 14 if (3 <= n && n <= 999) break; 15 } catch (Exception ignored) { stdIn.next(); } 16 } 17 18 JFrame gw = new JFrame("円と正多角形"); 19 gw.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 20 gw.setSize(1000, 1000); 21 gw.setLocationRelativeTo(null); 22 23 gw.add(new Test1(n)); 24 gw.setVisible(true); 25 } 26 27 private int n; 28 29 public Test1(int n) { 30 this.n = n; 31 printApproximationPI(); 32 33 SpinnerNumberModel model = new SpinnerNumberModel(n, 3, 999, 1); 34 JSpinner spinner = new JSpinner(model); 35 spinner.addChangeListener(e -> { 36 this.n = (int) spinner.getValue(); 37 repaint(); 38 printApproximationPI(); 39 }); 40 add(spinner); 41 } 42 43 @Override public void paintComponent(Graphics g) { 44 super.paintComponent(g); 45 46 int x0 = getWidth() / 2; 47 int y0 = getHeight() / 2; 48 int r = Math.min(x0, y0) / 5 * 4; 49 50 g.setColor(Color.BLUE); 51 g.drawOval(x0 - r, y0 - r, r * 2, r * 2); 52 53 54 int[] x = new int[n]; 55 int[] y = new int[n]; 56 double delta = 2 * Math.PI / n; 57 58 for (int i = 0; i < n; i++) { 59 x[i] = (int) (Math.cos(-Math.PI / 2 + delta * i) * r) + x0; 60 y[i] = (int) (Math.sin(-Math.PI / 2 + delta * i) * r) + y0; 61 } 62 g.setColor(Color.RED); 63 g.drawPolygon(x, y, n); 64 } 65 66 private void printApproximationPI() { 67 double a = n; 68 double b = 180 / a; 69 double m = Math.toRadians(b); 70 double l = a * (Math.sin(m)); 71 System.out.println("正" + n + "角形の円周率の近似:" + l); 72 } 73}

投稿2022/09/14 21:43

編集2022/09/22 08:59
TN8001

総合スコア9321

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

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

jimbe

2022/09/15 02:26

最初のうちは「main メソッド以外の static の記述は禁止」ぐらいのことにしても良いのかもしれません。
TN8001

2022/09/15 14:56

私も同じこと言っていましたねw [なぜか一回のクリックでイベントが複数回起こる。](https://teratail.com/questions/236651) いま過去回答を見直して傾向等のデータを集めてみようと作業しだしたところでした(1000回答行ったら集計するつもり)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問