🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Java

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

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

Q&A

1回答

1076閲覧

描画専用クラスのメソッドから引数指定で図形を書きたい。

chokokorone333

総合スコア32

Java

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

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

0グッド

0クリップ

投稿2019/12/06 18:13

やりたいこと

描画クラス(様々な形を持っている)を作り、描画したい形のメソッドに引数を渡して画面領域に描画したい。

現在困っていること

以下のコードでは、Paintクラスのインストラクタを作成した際のコンストラクタで円を描いている状態です。
これでは、円を複数描写したいときに、インスタンスを複数生成しなくてはなりません。

試したこと

  • コンストラクタを排除し、Graphics gをクラス頭で宣言し、draw(int x, int y, int width, int height)メソッドを作った。 etc...

上記の考えの元

その他参考にしたサイト

https://java-beginner.com/swing-draw/

https://nompor.com/2017/11/30/post-1503/


以下、困っていることで書いたコードです。アドバイスお願いします。

java

1class Window extends JFrame 2{ 3 public Window(String title, int width, int height) { 4 super(title); 5 setDefaultCloseOperation(EXIT_ON_CLOSE); 6 setSize(width,height); 7 setLocationRelativeTo(null); 8 setResizable(false); 9 } 10} 11 12class Paint extends JPanel { 13 private int x, y, width, height; 14 Paint(int x, int y, int width, int height) 15 { 16 this.x = x; 17 this.y = y; 18 this.width = width; 19 this.height = height; 20 } 21 @Override 22 public void draw(Graphics g){ 23 g.setColor(Color.BLACK); 24 g.fillOval(x, y, width, height); 25 } 26} 27 28class Draw 29{ 30 public static void main(String[] args) 31 { 32 Window wd = new Window("test", 600, 600); 33 wd.setVisible(true); 34 wd.add(new Panel(300, 300, 600, 600)); 35 } 36 } 37}

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

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

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

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

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

jimbe

2019/12/06 18:29

> Paintクラスのインストラクタ インスタンス, ですね.
guest

回答1

0

先のご質問 GUIに描画する為のclassの作成が思うようにできません。 で回答させて頂きました通り,「表示に必要な情報をコンポーネントに入れておき, paintComponent 等が呼ばれたらそれを使って表示する」ことで出来ます.

java

1import java.awt.Color; 2import java.awt.Graphics; 3import java.util.ArrayList; 4import java.util.List; 5 6import javax.swing.JFrame; 7import javax.swing.JPanel; 8 9class Window extends JFrame { 10 public Window(String title, int width, int height) { 11 super(title); 12 setDefaultCloseOperation(EXIT_ON_CLOSE); 13 setSize(width,height); 14 setLocationRelativeTo(null); 15 setResizable(false); 16 } 17} 18interface DrawObject { 19 void draw(Graphics g); 20} 21//黒円 22class CircleDrawObject implements DrawObject { 23 private int x, y, width, height; 24 CircleDrawObject(int x, int y, int width, int height) { 25 this.x = x; 26 this.y = y; 27 this.width = width; 28 this.height = height; 29 } 30 public void draw(Graphics g) { 31 g.setColor(Color.BLACK); 32 g.fillOval(x, y, width, height); 33 } 34} 35//赤四角 36class SquareDrawObject implements DrawObject { 37 private int x, y, width, height; 38 SquareDrawObject(int x, int y, int width, int height) { 39 this.x = x; 40 this.y = y; 41 this.width = width; 42 this.height = height; 43 } 44 public void draw(Graphics g) { 45 g.setColor(Color.RED); 46 g.fillRect(x, y, width, height); 47 } 48} 49class Paint extends JPanel { 50 private List<DrawObject> objectList = new ArrayList<>(); 51 void addDrawObject(DrawObject object) { 52 objectList.add(object); 53 } 54 @Override 55 protected void paintComponent(Graphics g) { 56 super.paintComponents(g); 57 for(DrawObject object : objectList) object.draw(g); 58 } 59} 60class Draw { 61 public static void main(String[] args) { 62 Window wd = new Window("test", 600, 600); 63 Paint paint = new Paint(); 64 wd.add(paint); 65 paint.addDrawObject(new CircleDrawObject(300, 300, 600, 600)); 66 paint.addDrawObject(new SquareDrawObject(100, 100, 200, 200)); 67 wd.setVisible(true); //この行を main の最後にしてください. 68 } 69}

なお, 前のご質問で指摘されていました通り, Window のような一般的な名前のクラスは既に java にあり, そのような名前を付けると読む側はどのクラスなのか分かり難くなります.
java のクラスは無数にあり, 絶対それらと違うクラス名を付けるというのは流石に無理がありますが, クラス名の付け方にもご注意されたほうが宜しいかと思います.

投稿2019/12/06 19:03

編集2019/12/06 19:05
jimbe

総合スコア13201

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問