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

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

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

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

Q&A

2回答

939閲覧

java awtの描画ツール処理について

Matatabimgmg

総合スコア0

Java

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

0グッド

0クリップ

投稿2022/11/09 04:49

前提

javaでマウスを押したら丸い図形が描画されるツールを作成しています。(java awt)

実現したいこと

常に同じ数の図形が表示されるようにしたい(例えば10個だとしたら、11個目を描画するときに一番古い図形を消す)です。できれば常に表示する数をコマンドライン引数で指定できるようにしたいです。

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

調べたのですがなかなか出てこなく、どなたか助けてほしいです。

該当のソースコード

package enshu_1102;

import java.awt.Color;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.ArrayList;

public class Paint2 extends Frame implements MouseListener,MouseMotionListener{
int x,y;
int sum= 0;
ArrayList<Figure> objList; //描画する全オブジェクトを管理する
Figure obj; //実際に描画するオブジェクト
public static void main(String[] args) {
Paint2 f = new Paint2();
f.setSize(640,480);//ウインドウサイズ
f.setTitle("Paint Sample");//タイトル名
//f.getContentPane().setBackground( Color.RED );
f.addWindowListener(new WindowAdapter() {
@Override public void windowClosing(WindowEvent e) {
System.exit(0); //
}});
f.setVisible(true);
}
Paint2(){ //objListの準備(マウスなどの)
objList = new ArrayList<Figure>();
//マウス処理の登録
addMouseListener(this);
addMouseMotionListener(this);
}
@Override public void paint(Graphics g){ //必要な時に勝手に呼び出してくれるメソッド
Figure f;
for(int i =0; i<objList.size(); i++) {
f = objList.get(i);
f.paint(g); //その要素のpaintメソッド呼び出し
}
if(obj != null) obj.paint(g); //現在作成中の要素も描画
}
@Override public void mousePressed(MouseEvent e) {//マウスボタンが押された時の処理
x = e.getX();//クリックされた座標
y = e.getY();
obj = new Circle(); //objクラスの変数にCircleを代入

obj.moveto(x,y); sum = sum + 1; System.out.println("Circle is :" + sum); //★1今までに描画した円の数 //System.out.println(objList); //objList.add(0,obj); repaint(); //ウインドウを再描画(paintを呼び出してくれる) } @Override public void mouseReleased(MouseEvent e) {//マウスボタンが離された時の処理 x = e.getX(); y = e.getY(); //obj = new Circle(); obj.moveto(x,y); objList.add(0,obj);//図形を追加 obj = null; repaint(); } public void mouseClicked(MouseEvent e) {} public void mouseEntered(MouseEvent e){}//コンポーネントにマウスが入ると呼び出される public void mouseExited(MouseEvent e){} //コンポーネントからマウスが出ると呼び出される public void mouseDragged(MouseEvent e){ //ボタンを押したまま動かした時の処理 x = e.getX(); y = e.getY(); /*obj = new Circle(); obj.moveto(x,y); objList.add(0, obj); repaint(); */ if(obj != null) obj.moveto(x,y); repaint(); } public void mouseMoved(MouseEvent e) {} } //マウスを話した瞬間にobjListに格納 //〇はobjに格納される

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

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

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

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

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

jimbe

2022/11/09 05:29 編集

コードの提示には「コードのマークダウン」を使用してください。 マークダウンを使用しないと、コード内の記号等がフォーマットに使用され、コピペしても実行できなかったりします。 マークダウンにつきましてはヘルプを参照してください。
jimbe

2022/11/09 05:31

>調べたのですがなかなか出てこなく 何が起きていて何を調べたのでしょうか。
guest

回答2

0

なぜ今更 AWT …昔の課題の使い回しでしょうか。
Figure や Circle がどんな定義なのか分からなかったのでテキトウに作りました。
ついでにドラッグでちらつきが酷かったのでダブルバッファリングしています。
Frame 直接では余計な描画がありそうだったので描画領域用に Panel を拡張して使っています。

「マウスを押したら丸い図形が描画される」ように、 mousePressed でリストに追加しています。それにより最新の Figure はリストの最後、最古の Figure はリストの最初となりますので、「例えば10個だとしたら、11個目を描画するときに一番古い図形を消す」は、(描画時では無く)追加する時に先頭を削除で行い、「現在作成中」(ドラッグ中)なのは最新の Figure なので別変数で管理する必要は無くリストの最後のオブジェクトを変更しています。
コマンドラインからの個数指定は、main メソッドで解析して渡しています。

DrawingFrame.java

java

1import java.awt.*; 2import java.awt.event.*; 3import java.awt.image.VolatileImage; 4import java.util.ArrayList; 5 6public class DrawingFrame extends Frame { 7 public static void main(String[] args) throws NumberFormatException { 8 int max = 10; 9 if(args.length >= 1) max = Integer.parseInt(args[0]); 10 new DrawingFrame(max).setVisible(true); 11 } 12 13 DrawingFrame(int max) { 14 super("Paint Sample"); 15 addWindowListener(new WindowAdapter() { 16 @Override 17 public void windowClosing(WindowEvent e) { 18 System.exit(0); 19 } 20 }); 21 setSize(640,480); 22 setResizable(false); 23 24 add(new DrawingPanel(max)); 25 } 26} 27 28class DrawingPanel extends Panel { 29 private java.util.List<Figure> figureList = new ArrayList<>(); 30 private VolatileImage backscreen; 31 32 DrawingPanel(int max) { 33 super(null); 34 //setBackground(Color.YELLOW); 35 36 MouseAdapter adapter = new MouseAdapter() { 37 @Override 38 public void mousePressed(MouseEvent e) { 39 while(figureList.size() >= max) figureList.remove(0); 40 figureList.add(new Circle(e.getX(), e.getY())); 41 System.out.println("Circle is :" + figureList.size()); //★1今までに描画した円の数 42 repaint(); 43 } 44 @Override 45 public void mouseDragged(MouseEvent e) { 46 figureList.get(figureList.size()-1).moveto(e.getX(), e.getY()); 47 repaint(); 48 } 49 }; 50 addMouseListener(adapter); 51 addMouseMotionListener(adapter); 52 } 53 54 @Override 55 public void update(Graphics g) { 56 paint(g); 57 } 58 59 @Override 60 public void paint(Graphics g) { 61 super.paint(g); 62 Dimension size = getSize(); 63 if(backscreen == null || backscreen.validate(getGraphicsConfiguration()) == VolatileImage.IMAGE_INCOMPATIBLE) { 64 backscreen = createVolatileImage(size.width, size.height); 65 } 66 Graphics bg = backscreen.getGraphics(); 67 bg.setColor(getBackground()); 68 bg.fillRect(0, 0, size.width, size.height); 69 for(Figure f : figureList) f.paint(bg); 70 bg.dispose(); 71 72 g.drawImage(backscreen, 0, 0, this); 73 } 74} 75 76class Circle extends Figure { 77 Circle(int x, int y) { 78 super(x, y); 79 } 80 @Override 81 public void paint(Graphics g) { 82 g.setColor(Color.GREEN); 83 g.fillOval(x-15, y-15, 30, 30); 84 } 85} 86 87abstract class Figure { 88 protected int x, y; 89 Figure(int x, int y) { 90 this.x = x; 91 this.y = y; 92 } 93 public void moveto(int x, int y) { 94 this.x = x; 95 this.y = y; 96 } 97 abstract public void paint(Graphics g); 98}

投稿2022/11/09 08:19

編集2022/11/09 17:13
jimbe

総合スコア12696

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

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

0

常に同じ数の図形が表示されるようにしたい(例えば10個だとしたら、11個目を描画するときに一番古い図形を消す)です。

Java

1objList.add(0,obj);//図形を追加

ここでリストの先頭に追加しているわけですが、11個になっていたらリストの最後を削除するだけでは?(描画順的に最後に追加して最初を削除のほうが好みです)
ArrayList#remove (Java Platform SE 8 )

コマンドライン引数で指定できるようにしたいです。

java コマンドライン引数 使い方 - Google 検索
java 文字列 数値 変換 - Google 検索

調べたのですがなかなか出てこなく、どなたか助けてほしいです。

まあ気持ちはわかりますが、ドンピシャな答えがあるほうが珍しいのであって基本的にはすべて応用問題です。
プログラミングはその場で試せて結果も即出ます。エラーが出ても全く気にする必要はありません。
仮説を立てて確認の繰り返しです。思いついたことをどんどん試してみましょう。

Java

1import java.awt.*; 2import java.awt.event.*; 3import java.util.*; 4 5 6public class Paint2 extends Frame implements MouseListener, MouseMotionListener { 7 public static void main(String[] args) { 8 int limit; 9 try { 10 limit = Integer.parseInt(args[0]); 11 } catch (Exception e) { // 雑いw 12 limit = 10; // デフォルト10個 13 } 14 new Paint2(limit).setVisible(true); 15 } 16 17 private final ArrayList<Figure> objList = new ArrayList<>(); 18 private final int limit; 19 private Figure obj; 20 21 Paint2(int limit) { 22 this.limit = limit; 23 24 setSize(640, 480); 25 setTitle("Paint Sample"); 26 27 addWindowListener(new WindowAdapter() { 28 @Override public void windowClosing(WindowEvent e) { System.exit(0); } 29 }); 30 addMouseListener(this); 31 addMouseMotionListener(this); 32 } 33 34 @Override public void paint(Graphics g) { 35 for (Figure f : objList) f.paint(g); 36 if (obj != null) obj.paint(g); 37 } 38 39 @Override public void mousePressed(MouseEvent e) { 40 obj = new Circle(); 41 obj.moveTo(e.getX(), e.getY()); 42 repaint(); 43 } 44 45 @Override public void mouseReleased(MouseEvent e) { 46 obj.moveTo(e.getX(), e.getY()); 47 48 objList.add(obj); // 図形を最後に追加 49 if (limit < objList.size()) { // リミットを超えていたら...(リミットが可変ならwhileのほうがいい) 50 objList.remove(0); // 先頭を削除 51 } 52 53 obj = null; 54 repaint(); 55 } 56 57 @Override public void mouseDragged(MouseEvent e) { 58 if (obj != null) { 59 obj.moveTo(e.getX(), e.getY()); 60 repaint(); 61 } 62 } 63 64 @Override public void mouseClicked(MouseEvent e) { } 65 66 @Override public void mouseEntered(MouseEvent e) { } 67 68 @Override public void mouseExited(MouseEvent e) { } 69 70 @Override public void mouseMoved(MouseEvent e) { } 71} 72 73class Circle extends Figure { 74 private final int r = random.nextInt(30, 60); 75 76 @Override public void paint(Graphics g) { 77 g.setColor(color); 78 g.fillOval(x - r, y - r, r * 2, r * 2); 79 } 80} 81 82abstract class Figure { 83 protected static final Random random = new Random(); 84 protected int x, y; 85 protected Color color = new Color(random.nextInt(0xFFFFFF)); 86 87 public abstract void paint(Graphics g); 88 89 public void moveTo(int x, int y) { 90 this.x = x; 91 this.y = y; 92 } 93}

(おそらく課題なのでしょうから)AWTはマストなのかもしれませんが、ちらつきが気になるのでSwing版。

Java

1import javax.swing.JFrame; 2import javax.swing.JPanel; 3import java.awt.Color; 4import java.awt.Graphics; 5import java.awt.event.MouseAdapter; 6import java.awt.event.MouseEvent; 7import java.util.LinkedList; 8import java.util.Random; 9 10 11public class Paint2 extends JPanel { 12 public static void main(String[] args) { 13 int limit; 14 try { 15 limit = Integer.parseInt(args[0]); 16 } catch (Exception e) { 17 limit = 10; 18 } 19 JFrame frame = new JFrame("Paint Sample"); 20 frame.setSize(640, 480); 21 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 22 frame.setLocationRelativeTo(null); 23 frame.add(new Paint2(limit)); 24 frame.setVisible(true); 25 } 26 27 private final LimitedQueue<Figure> figures; 28 private Figure current; 29 30 Paint2(int limit) { 31 figures = new LimitedQueue<>(limit); 32 setBackground(Color.WHITE); 33 34 MouseAdapter listener = new MouseAdapter() { 35 @Override public void mousePressed(MouseEvent e) { 36 current = new Circle(); 37 current.moveTo(e.getX(), e.getY()); 38 repaint(); 39 } 40 41 @Override public void mouseReleased(MouseEvent e) { 42 current.moveTo(e.getX(), e.getY()); 43 figures.add(current); 44 current = null; 45 repaint(); 46 } 47 48 @Override public void mouseDragged(MouseEvent e) { 49 if (current != null) { 50 current.moveTo(e.getX(), e.getY()); 51 repaint(); 52 } 53 } 54 }; 55 addMouseListener(listener); 56 addMouseMotionListener(listener); 57 } 58 59 @Override protected void paintComponent(Graphics g) { 60 super.paintComponent(g); 61 for (Figure f : figures) f.paint(g); 62 if (current != null) current.paint(g); 63 } 64} 65 66class Circle extends Figure { 67 private final int r = random.nextInt(30, 60); 68 69 @Override public void paint(Graphics g) { 70 g.setColor(color); 71 g.fillOval(x - r, y - r, r * 2, r * 2); 72 } 73} 74 75abstract class Figure { 76 protected static final Random random = new Random(); 77 protected int x, y; 78 protected Color color = new Color(random.nextInt(0xFFFFFF)); 79 80 public abstract void paint(Graphics g); 81 82 public void moveTo(int x, int y) { 83 this.x = x; 84 this.y = y; 85 } 86} 87 88// サイズ制限のあるリスト(やってることは同じ) 89// [collections - Size-limited queue that holds last N elements in Java - Stack Overflow](https://stackoverflow.com/questions/5498865/size-limited-queue-that-holds-last-n-elements-in-java) 90class LimitedQueue<E> extends LinkedList<E> { 91 private final int limit; 92 93 public LimitedQueue(int limit) { 94 this.limit = limit; 95 } 96 97 @Override public boolean add(E o) { 98 boolean added = super.add(o); 99 while (added && limit < size()) remove(); 100 return added; 101 } 102}

投稿2022/11/09 09:56

編集2022/11/09 10:00
TN8001

総合スコア9363

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

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

TN8001

2022/11/09 09:56

jimbeさんの回答と大差ないですが、Swing版も欲しかったので^^;
jimbe

2022/11/11 10:28

> LimitedQueue 取り出しで無くなるわけでは無いので、配列でリングバッファでも良いかもしれません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問