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

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

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

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

Q&A

解決済

2回答

1947閲覧

Javaでウィンドウに四角を複数、座標を変えて描画する簡潔なコードの書き方が知りたいです

H-JP

総合スコア3

Java

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

1グッド

0クリップ

投稿2022/02/11 09:25

編集2022/02/11 12:30

前提・実現したいこと
ウィンドウに四角を複数描画したいが、座標を変えて同じものを描画するだけなので無駄にコードを増やしたくなく、省略する方法を探しています。

該当のソースコード

Java

1class Window extends JFrame{ 2 static JFrame mainFrame = new JFrame("The Mountain");; 3 //contentpaneを取得しそこにパネルを配置 4 static Container contentPane = mainFrame.getContentPane(); 5 public static void Win() { 6 Square sq = new Square(); 7 Container cp = mainFrame.getContentPane(); 8 cp.add( sq ); 9 mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 10 mainFrame.setSize(330, 650); 11 mainFrame.setLocationRelativeTo(null); 12 //フレームを表示 13 mainFrame.setVisible(true); 14 } 15 } 16class Square extends JPanel{ 17 public void paint(Graphics g) { 18 super.paintComponent(g); 19 g.fillRect(260,400,30,30);//塗りつぶし 20 } 21 }

これによって四角が一つは描画できている状態です。

自分で調べたことや試したこと
Squareクラスの引数をg1,g2...のように増やしていってsuper.paintComponent(g○);とg○.fillRect();を増やしてみたのですが二つ以上は描画されませんでした。また、この方法でできたとしてもプログラムが長くなってしまうので望んでいる形ではありません。Squareクラスのインスタンスを複数生成してリストにいれて簡潔に管理するという方法はできるのかなど考えましたが描画する座標を変えたいのでそれはできないか..という感じで手詰まりです。

使っているツールのバージョンなど補足情報
JavaSE-17,EclipseIDE
プログラミング言語を学ぶのはJavaが初めてで学び始めて1週間程度ですが、独習Javaという本を読んだだけなのでまずは作りたいものを作りながら学んでいこうと思い一昨日辺りから書き始めました。一つ一つのコードを理解しながら書いていきたいと思っていますがstatic Container contentPane = mainFrame.getContentPane();とContainer cp = mainFrame.getContentPane();二つは何を表しているのかがなんとなくでしかわかっていませんのでおかしいと思われる箇所は他にもご指摘いただきたいです。

TN8001👍を押しています

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

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

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

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

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

jimbe

2022/02/11 12:03

コードはマークダウン記法をご利用ください。 マークダウン記法に付きましてはヘルプをご参照ください。
jimbe

2022/02/11 12:06

ご提示のコードはそのままでは実行できません。 どのように実行されましたでしょうか。
jimbe

2022/02/11 12:32

> ウィンドウに四角を複数描画したいが、座標を変えて同じものを描画するだけなので無駄にコードを増やしたくなく、省略する方法を探しています。 まず複数 (3 つ程度 ?) 描画するコードを作っては如何でしょう。
H-JP

2022/02/11 12:36

同じファイルの中でDisplayクラスというものを作り、ボタンやラベルの追加を行い、最後にWindowクラスのWinメソッドを呼び出すというメソッドを作りました。そしてそのメソッドを別のファイル(ゲーム進行を行うためのもの)にあるメソッドで呼び出すという形で実行しています。調べたところゲームを作る際は画面表示を行うクラスとゲームを進行するクラスは分けた方が良いと書いてあったので分けてみたのですがファイルも別々のものにするのはなぜだかいまいちわかっておりません。
jimbe

2022/02/11 13:27

> おかしいと思われる箇所は他にもご指摘いただきたいです。 ということから言いますと、恐らく全体構造は分かり難い方向になっているように思います。(個人の感想です。念の為。) 画面表示とゲーム進行のクラスは分けるのかもしれませんが、 Window と Display は何故分けるのでしょうか。 ボタンやラベルの追加を Window のコンストラクタで行ってしまえば良いように思います。 (蛇足ですが、 "Window" というクラスは Swing/AWT にありますので紛らわしいです。 "Mountain" の JFrame なのでしたら、"MountainFrame" 等としては如何でしょうか。)
H-JP

2022/02/11 16:43

アドバイスありがとうございます、今一度クラスを整理しようと思います。
guest

回答2

0

Square クラスをパネル内で "四角を書くクラス" としてみました。

java

1import java.awt.*; 2import java.util.ArrayList; 3import java.util.List; 4 5import javax.swing.JFrame; 6import javax.swing.JPanel; 7 8public class MountainFrame extends JFrame { 9 public static void main(String[] args) { 10 new MountainFrame().setVisible(true); //フレームを生成・表示 11 } 12 13 public MountainFrame() { 14 super("The Mountain"); 15 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 16 setSize(330, 650); 17 setLocationRelativeTo(null); 18 19 DrawingPanel drawingPanel = new DrawingPanel(); 20 drawingPanel.addSquare(260,400,30,30,Color.RED); 21 drawingPanel.addSquare(100,100,30,30,Color.BLUE); 22 drawingPanel.addSquare(150,300,20,40,Color.GREEN); 23 24 //contentpaneを取得し…なくても直接 add で配置出来る 25 add(drawingPanel); 26 } 27} 28 29class DrawingPanel extends JPanel { 30 //四角塗りつぶし 31 private static class Square { 32 final int x, y, width, height; 33 final Color color; 34 Square(int x, int y, int width, int height, Color color) { 35 this.x = x; 36 this.y = y; 37 this.width = width; 38 this.height = height; 39 this.color = color; 40 } 41 void draw(Graphics g) { 42 g.setColor(color); 43 g.fillRect(x, y, width, height); 44 } 45 }; 46 private List<Square> squareList = new ArrayList<>(); 47 48 void addSquare(int x, int y, int width, int height, Color color) { 49 synchronized(squareList) { 50 squareList.add(new Square(x, y, width, height, color)); 51 } 52 repaint(); 53 } 54 55 @Override 56 public void paintComponent(Graphics g) { 57 super.paintComponent(g); 58 59 Square[] squares; 60 synchronized(squareList) { 61 squares = squareList.toArray(new Square[squareList.size()]); 62 } 63 for(Square square : squares) square.draw(g); 64 } 65} 66

投稿2022/02/11 13:58

編集2022/02/12 17:34
jimbe

総合スコア12639

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

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

H-JP

2022/02/11 16:42

ありがとうございます、ContentPaneを取得しなくてもよいというのはどこにも載っていなかったので知ることができてよかったです。
guest

0

ベストアンサー

Squareクラスの引数をg1,g2...のように増やしていってsuper.paintComponent(g○);とg○.fillRect();を増やしてみたのですが二つ以上は描画されませんでした。

増やすのはfillRectのほうです。

Java

1g.fillRect(260, 400, 30, 30); 2g.fillRect(260, 440, 30, 30);

また、この方法でできたとしてもプログラムが長くなってしまうので望んでいる形ではありません。

ということは何か法則性があるってことですね?
だったらfor等を使えば短く書けますね。

static Container contentPane = mainFrame.getContentPane();とContainer cp = mainFrame.getContentPane();二つは何を表しているのかがなんとなくでしかわかっていません

この辺まあいろいろあるんですが、mainFrame.add(sq);で意味は同じになるんで「JFrameに追加するのね」位の認識でよろしいかと思います。

仕組みがわからないと寝られないタイプの方は、↓らへんを見てください。
How to Use Root Panes (The Java™ Tutorials > Creating a GUI With Swing > Using Swing Components)

Java

1import javax.swing.JFrame; 2import javax.swing.JPanel; 3import java.awt.Color; 4import java.awt.Container; 5import java.awt.Graphics; 6import java.awt.Graphics2D; 7import java.awt.Point; 8import java.awt.Rectangle; 9 10 11class Window extends JFrame { 12 // 間違いというわけではないが、提示コードの範囲ではローカル変数で十分に見える。 13 // ほかのクラスで使用したいということなら、その限りではない。 14 // static JFrame mainFrame = new JFrame("The Mountain");; 15 // static Container contentPane = mainFrame.getContentPane(); 16 17 // public static void Win() { 18 public static void main(String[] args) { 19 JFrame mainFrame = new JFrame(); 20 mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 21 mainFrame.setSize(330, 650); 22 mainFrame.setLocationRelativeTo(null); 23 24 Square sq = new Square(); 25 26 // Container cp = mainFrame.getContentPane(); 27 // cp.add(sq); 28 // ↑↓同じ意味なので↓の方がスッキリ 29 mainFrame.add(sq); 30 31 mainFrame.setVisible(true); 32 } 33} 34 35class Square extends JPanel { 36 private final Point[] points = new Point[]{ 37 new Point(120, 120), 38 new Point(240, 80), 39 new Point(180, 220), 40 }; 41 42 private final Rectangle[] rectangles = new Rectangle[]{ 43 new Rectangle(120, 340, 30, 30), 44 new Rectangle(160, 400, 50, 20), 45 new Rectangle(80, 480, 40, 30), 46 }; 47 48 // SwingではpaintComponentをオーバーライドする 49 // public void paint(Graphics g) { 50 @Override public void paintComponent(Graphics g) { 51 super.paintComponent(g); 52 53 // 複数描きたいなら続けて描くだけ 54 g.fillRect(260, 400, 30, 30); 55 g.fillRect(260, 440, 30, 30); 56 g.fillRect(260, 480, 30, 30); 57 58 // 何か法則性があるならループを使えば行数を減らせる 59 g.setColor(Color.RED); 60 for (int i = 0; i < 10; i++) { 61 g.fillRect(40, i * 40 + 40, 30, 30); 62 } 63 64 // 法則性がないなら事前に座標を配列等でもっておく?(行数は減らないが^^; 65 g.setColor(Color.GREEN); 66 for (Point p : points) { 67 g.fillRect(p.x, p.y, 30, 30); 68 } 69 70 // サイズもバラバラな場合はRectangleクラスがある 71 g.setColor(Color.BLUE); 72 Graphics2D g2 = (Graphics2D) g; 73 for (Rectangle r : rectangles) { 74 g2.fill(r); 75 } 76 } 77}

アプリ画像

投稿2022/02/11 13:33

編集2023/07/30 04:42
TN8001

総合スコア9317

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

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

H-JP

2022/02/11 16:40

わざわざ実行結果画面までつけて頂きありがとうございます、とても為になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問