回答編集履歴

2

コードの修正及び追記

2019/01/06 14:33

投稿

CreeperSaviour
CreeperSaviour

スコア129

test CHANGED
@@ -8,7 +8,7 @@
8
8
 
9
9
  修正版
10
10
 
11
- ```
11
+ ```Java
12
12
 
13
13
  import java.awt.BorderLayout;
14
14
 
@@ -68,8 +68,6 @@
68
68
 
69
69
  Graphics g = getGraphics();
70
70
 
71
- g.drawLine(e.getX(), e.getY(), e.getX(), e.getY());
72
-
73
71
  time++;
74
72
 
75
73
 
@@ -82,7 +80,7 @@
82
80
 
83
81
  } else {
84
82
 
85
- point[time - 1] = new Point(e.getX(), e.getY());
83
+ point[time - 1] = e.getPoint();
86
84
 
87
85
  g.drawLine(e.getX(), e.getY(), e.getX(), e.getY());
88
86
 
@@ -150,8 +148,230 @@
150
148
 
151
149
  やっていること
152
150
 
153
- - mousePressed(mouseClicledでもいい)から押した座標を取得する
151
+ - mousePressedから押した座標を取得する
154
152
 
155
153
  - drawLine(startX, startY, endX, endY)で描画する(点ならstartXとendX,startYとendYは同じにする)
156
154
 
157
155
  - mouseEventクラス内にtime(int型)を用意し、何回クリックしたかを記録している
156
+
157
+
158
+
159
+ 質問者さんはJPanel(ExPanel)の方にaddMouseListner()としていたようですが縦に30、横に10ほどずれが生じます。(故に最初変なコードになったわけですが)
160
+
161
+ KSwordOfHasteさんが仰る通り、mousePressedはマウス1回のクリックにつき1度行われます。
162
+
163
+
164
+
165
+ ```
166
+
167
+ if (time == 3) {
168
+
169
+ g.drawLine((int) point[0].getX(), (int) point[0].getY(), (int) point[1].getX(), (int) point[1].getY());
170
+
171
+ g.drawLine((int) point[1].getX(), (int) point[1].getY(), (int) point[2].getX(), (int) point[2].getY());
172
+
173
+ g.drawLine((int) point[2].getX(), (int) point[2].getY(), (int) point[0].getX(), (int) point[0].getY());
174
+
175
+ }
176
+
177
+ ```
178
+
179
+ (僕のコード)ここについては、全てint型にキャストしているのですが、ここはあまり良くないコードかと思いました。下のコードの方が良いかもしれません。(これもわざわざDotクラスを作っているのでどちらが良いのかはわかりませんが)
180
+
181
+ ```Java
182
+
183
+ import java.awt.BorderLayout;
184
+
185
+ import java.awt.Color;
186
+
187
+ import java.awt.Graphics;
188
+
189
+ import java.awt.event.MouseEvent;
190
+
191
+ import java.awt.event.MouseListener;
192
+
193
+
194
+
195
+ import javax.swing.JFrame;
196
+
197
+ import javax.swing.JPanel;
198
+
199
+
200
+
201
+ public class PaintTriangle extends JFrame {
202
+
203
+
204
+
205
+ class Dot {
206
+
207
+
208
+
209
+ private int x, y;
210
+
211
+
212
+
213
+ Dot() {
214
+
215
+ x = 0;
216
+
217
+ y = 0;
218
+
219
+ }
220
+
221
+
222
+
223
+ Dot(int x, int y) {
224
+
225
+ this.x = x;
226
+
227
+ this.y = y;
228
+
229
+ }
230
+
231
+
232
+
233
+ public int getX() {
234
+
235
+ return x;
236
+
237
+ }
238
+
239
+
240
+
241
+ public int getY() {
242
+
243
+ return y;
244
+
245
+ }
246
+
247
+ }
248
+
249
+
250
+
251
+ class mouseEvent implements MouseListener {
252
+
253
+
254
+
255
+ int time = 0;
256
+
257
+ Dot dot[] = new Dot[3];
258
+
259
+
260
+
261
+ @Override
262
+
263
+ public void mouseClicked(MouseEvent e) {}
264
+
265
+
266
+
267
+ @Override
268
+
269
+ public void mouseEntered(MouseEvent e) {}
270
+
271
+
272
+
273
+ @Override
274
+
275
+ public void mouseExited(MouseEvent e) {}
276
+
277
+
278
+
279
+ @Override
280
+
281
+ public void mousePressed(MouseEvent e) {
282
+
283
+ Graphics g = getGraphics();
284
+
285
+ time++;
286
+
287
+
288
+
289
+ if (time == 4) {
290
+
291
+ time = 0;
292
+
293
+ repaint();
294
+
295
+ } else {
296
+
297
+ dot[time - 1] = new Dot(e.getX(), e.getY());
298
+
299
+ g.drawLine(e.getX(), e.getY(), e.getX(), e.getY());
300
+
301
+ if (time == 3) {
302
+
303
+ g.drawLine(dot[0].getX(), dot[0].getY(), dot[1].getX(), dot[1].getY());
304
+
305
+ g.drawLine(dot[1].getX(), dot[1].getY(), dot[2].getX(), dot[2].getY());
306
+
307
+ g.drawLine(dot[2].getX(), dot[2].getY(), dot[0].getX(), dot[0].getY());
308
+
309
+ }
310
+
311
+ }
312
+
313
+
314
+
315
+ }
316
+
317
+
318
+
319
+ @Override
320
+
321
+ public void mouseReleased(MouseEvent e) {}
322
+
323
+
324
+
325
+ }
326
+
327
+
328
+
329
+ public static void main(String[] args) {
330
+
331
+ new PaintTriangle("三角形の描画");
332
+
333
+ }
334
+
335
+
336
+
337
+ PaintTriangle(String title) {
338
+
339
+ setTitle(title);
340
+
341
+ setBounds(100, 100, 300, 200);
342
+
343
+ setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
344
+
345
+ setVisible(true);
346
+
347
+ JPanel panel = new JPanel();
348
+
349
+ panel.setBackground(Color.yellow);
350
+
351
+ add(panel, BorderLayout.CENTER);
352
+
353
+ addMouseListener(new mouseEvent());
354
+
355
+ }
356
+
357
+ }
358
+
359
+
360
+
361
+ ```
362
+
363
+
364
+
365
+ ところで僕の知識不足なのですが、
366
+
367
+ ```
368
+
369
+ g.setColor(Color.blue);
370
+
371
+ g.fillOval(x,y,10,10);
372
+
373
+ ```
374
+
375
+ この部分は何のために書いたのでしょうか?
376
+
377
+ 僕にはわからなかったのですが、後学のために教えていただきたいと思っています。

1

修正

2019/01/06 14:33

投稿

CreeperSaviour
CreeperSaviour

スコア129

test CHANGED
@@ -1,8 +1,14 @@
1
- 取り敢えずkitagawashoさんのコードを基に作ってみましたが初心者故に、奇妙なコードになっているので、やり方だけを読み取ることをおすすめします。
2
-
3
1
  以下コードです
4
2
 
3
+ (悪コードだったので削除させていただきました。修正版の方をお読みください。)
4
+
5
+ (これも悪コードかもしれませんが)
6
+
7
+
8
+
9
+ 修正版
10
+
5
- ```Java
11
+ ```
6
12
 
7
13
  import java.awt.BorderLayout;
8
14
 
@@ -28,23 +34,13 @@
28
34
 
29
35
 
30
36
 
31
- class ExPanel extends JPanel {
37
+ class mouseEvent implements MouseListener {
32
38
 
33
39
 
34
40
 
35
- @Override
41
+ int time = 0;
36
42
 
37
- public void paintComponent(Graphics g) {
38
-
39
- super.paintComponent(g);
43
+ Point point[] = new Point[3];
40
-
41
- }
42
-
43
- }
44
-
45
-
46
-
47
- class MyMouseListener implements MouseListener {
48
44
 
49
45
 
50
46
 
@@ -72,21 +68,25 @@
72
68
 
73
69
  Graphics g = getGraphics();
74
70
 
75
- times++;
71
+ g.drawLine(e.getX(), e.getY(), e.getX(), e.getY());
76
72
 
77
- if (times == 4) {
73
+ time++;
78
74
 
75
+
76
+
77
+ if (time == 4) {
78
+
79
- times = 0;
79
+ time = 0;
80
80
 
81
81
  repaint();
82
82
 
83
83
  } else {
84
84
 
85
- point[times - 1] = new Point(e.getX() + 10, e.getY() + 30);
85
+ point[time - 1] = new Point(e.getX(), e.getY());
86
86
 
87
- g.drawLine(e.getX() + 10, e.getY() + 30, e.getX() + 10, e.getY() + 30);
87
+ g.drawLine(e.getX(), e.getY(), e.getX(), e.getY());
88
88
 
89
- if (times == 3) {
89
+ if (time == 3) {
90
90
 
91
91
  g.drawLine((int) point[0].getX(), (int) point[0].getY(), (int) point[1].getX(), (int) point[1].getY());
92
92
 
@@ -97,6 +97,8 @@
97
97
  }
98
98
 
99
99
  }
100
+
101
+
100
102
 
101
103
  }
102
104
 
@@ -112,23 +114,11 @@
112
114
 
113
115
 
114
116
 
115
- public static void main(String args[]) {
117
+ public static void main(String[] args) {
116
118
 
117
119
  new PaintTriangle("三角形の描画");
118
120
 
119
121
  }
120
-
121
-
122
-
123
- Point point[] = new Point[3];
124
-
125
-
126
-
127
- int times = 0;
128
-
129
-
130
-
131
- int x = -10, y = -10;
132
122
 
133
123
 
134
124
 
@@ -140,21 +130,17 @@
140
130
 
141
131
  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
142
132
 
143
-
144
-
145
- ExPanel ep = new ExPanel();
146
-
147
- ep.setBackground(Color.yellow);
148
-
149
- add(ep, BorderLayout.CENTER);
150
-
151
- ep.addMouseListener(new MyMouseListener());
152
-
153
133
  setVisible(true);
154
134
 
135
+ JPanel panel = new JPanel();
136
+
137
+ panel.setBackground(Color.yellow);
138
+
139
+ add(panel, BorderLayout.CENTER);
140
+
141
+ addMouseListener(new mouseEvent());
142
+
155
143
  }
156
-
157
-
158
144
 
159
145
  }
160
146
 
@@ -162,14 +148,10 @@
162
148
 
163
149
  ```
164
150
 
151
+ やっていること
165
152
 
153
+ - mousePressed(mouseClicledでもいい)から押した座標を取得する
166
154
 
167
- ```
155
+ - drawLine(startX, startY, endX, endY)で描画する(点ならstartXとendX,startYとendYは同じにする)
168
156
 
169
- point[times - 1] = new Point(e.getX() + 10, e.getY() + 30);
157
+ - mouseEventクラス内にtime(int)を用意し、何回クリックしたかを記録している
170
-
171
- g.drawLine(e.getX() + 10, e.getY() + 30, e.getX() + 10, e.getY() + 30);
172
-
173
- ```
174
-
175
- ここは特に変で、一度新しくコードを書くほうが良いかなと思いました(追記します)