常に同じ数の図形が表示されるようにしたい(例えば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}