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

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

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

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

Swing

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

Q&A

解決済

1回答

4586閲覧

マウスクリックのたびに少しずつ大きい円を描画したいのですが…

kazz0117

総合スコア16

Java

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

Swing

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

0グッド

0クリップ

投稿2016/01/18 13:11

編集2016/01/18 13:56

###実現したいこと
Javaでマウスクリックのたびにマウス座標を中心として円を描くプログラムを作成しています。static変数を使って描かれる円が少しずつ大きくなっていくようにしたいのです(イメージとしては・→ o → O → 〇)、

###発生している問題・エラーメッセージ
ところが過去に描いた円も一緒に大きくなってしまいます。
どこを修正すればいいか分からなくなってしまいました。
###ソースコード
Java
Circle.java::
import java.awt.Color;
import java.awt.Graphics;

public class Circle
{
private int x;
private int y;

private static int radius = 0; public Circle(int x, int y) { this.x = x; this.y = y; radius++; } public void draw(Graphics g) { g.setColor(Color.red); g.drawOval(x - radius / 2, y - radius / 2, radius, radius); }

}

Sample4.java::
import java.awt.BorderLayout;
import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.Iterator;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class Sample4 extends JFrame
{
private SamplePanel sp;

public static void main(String[] args) { Sample4 sm = new Sample4(); sm.setVisible(true); } public Sample4() { super("円を描画"); setDefaultCloseOperation(EXIT_ON_CLOSE); setSize(500, 500); sp = new SamplePanel(); add(sp, BorderLayout.CENTER); } public class SamplePanel extends JPanel { private ArrayList<Circle> circlelist = new ArrayList<Circle>(); public SamplePanel() { addMouseListener(new SampleMouseListener()); } public void paint(Graphics g) { super.paint(g);; Iterator<Circle> it = circlelist.iterator(); while(it.hasNext()) { Circle c = it.next(); c.draw(g);; } } public class SampleMouseListener extends MouseAdapter { public void mousePressed(MouseEvent e) { circlelist.add(new Circle(e.getX(), e.getY())); repaint(); } } }

}

###補足情報(言語/FW/ツール等のバージョンなど)
ご回答ありがとうございます。うまくいきました。
Circle.java::
import java.awt.Color;
import java.awt.Graphics;

public class Circle
{
private int x;
private int y;
private int radius;

public Circle(int x, int y, int radius) { this.x = x; this.y = y; this.radius = radius; } public void draw(Graphics g) { g.setColor(Color.red); g.drawOval(x - radius / 2, y - radius / 2, radius, radius); }

}

Sample4.java::
import java.awt.BorderLayout;
import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.Iterator;

import javax.swing.JFrame;
import javax.swing.JPanel;

public class Sample4 extends JFrame
{
private SamplePanel sp;

public static void main(String[] args) { Sample4 sm = new Sample4(); sm.setVisible(true); } public Sample4() { super("円を描画"); setDefaultCloseOperation(EXIT_ON_CLOSE); setSize(500, 500); sp = new SamplePanel(); add(sp, BorderLayout.CENTER); } public class SamplePanel extends JPanel { private int radius = 0; private ArrayList<Circle> circlelist = new ArrayList<Circle>(); public SamplePanel() { addMouseListener(new SampleMouseListener()); } public void paint(Graphics g) { super.paint(g);; Iterator<Circle> it = circlelist.iterator(); while(it.hasNext()) { Circle c = it.next(); c.draw(g); } } public class SampleMouseListener extends MouseAdapter { public void mousePressed(MouseEvent e) { circlelist.add(new Circle(e.getX(), e.getY(), radius++)); repaint(); } } }

}

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

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

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

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

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

guest

回答1

0

ベストアンサー

過去に描画した円はそのままのサイズで、新しく追加した円だけを少しずつ大きくする。

ということであれば、過去の円のサイズは保持し続けなければなりませんよね。static で持ってしまうと、(個別ではなく)今まで作ったのも含めて全ての Circle クラスで共通した値として扱われてしまいます。そのため、今回のような目的においては Circle クラスの radius は static で持つべきではありません。

解決策としては Circle クラスのフィールドとしてサイズを持たせて、x や y と同様にコンストラクタに初期値を渡して設定されるようにすると良いでしょう。

次に Sample4 クラスあるいは SamplePanel クラスのフィールドとして円に設定するサイズを持っておき、Circle クラスを追加する度に値を大きくしていけば良いでしょう。別段ここでもサイズは static で持つ必要はありません。

以上、ご参考になれば幸いです。

投稿2016/01/18 13:46

ps13zier

総合スコア433

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

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

kazz0117

2016/01/18 13:57

明快なご回答ありがとうございます。すぐに修正版を作成でき、動作も思い通りになりました!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問