回答編集履歴

3

コード追加

2020/03/29 06:22

投稿

jimbe
jimbe

スコア12659

test CHANGED
@@ -373,3 +373,329 @@
373
373
  }
374
374
 
375
375
  ```
376
+
377
+ #追加2
378
+
379
+ リンク先での「線の色を指定できるように」という課題でのヒントにおきまして「『Javaって何ですか?』の章の例題が参考」とありますが, アプレット(AWT)ですので, アプリケーション(Swing)化しました.
380
+
381
+ 色の設定は Choice(AWT) から JComboBox(Swing) に変わりますが, 扱い方(addItem 等)はあえて変えていません.
382
+
383
+ ```java
384
+
385
+ //package teratail.q249928;
386
+
387
+
388
+
389
+ import java.awt.*;
390
+
391
+ import java.awt.event.*;
392
+
393
+
394
+
395
+ import javax.swing.*;
396
+
397
+
398
+
399
+ // Lineクラス
400
+
401
+ class Line {
402
+
403
+ Point sp, ep; // 始点と終点
404
+
405
+ Color color; // 色
406
+
407
+
408
+
409
+ // コンストラクタ
410
+
411
+ Line(Point p1, Point p2, Color c) {
412
+
413
+ sp=p1; ep=p2; color=c;
414
+
415
+ }
416
+
417
+ // 描画
418
+
419
+ void draw(Graphics g) {
420
+
421
+ g.setColor(color);
422
+
423
+ g.drawLine(sp.x, sp.y, ep.x, ep.y);
424
+
425
+ }
426
+
427
+ }
428
+
429
+
430
+
431
+ // JControlPanelクラス
432
+
433
+ class JControlPanel extends JPanel implements ActionListener {
434
+
435
+ private JSimpleDrawMain app;
436
+
437
+ // コンストラクタ
438
+
439
+ public JControlPanel(JSimpleDrawMain app) {
440
+
441
+ super(new FlowLayout());
442
+
443
+ this.app = app;
444
+
445
+ JComboBox<String> ch = new JComboBox<>();
446
+
447
+ ch.addItem("Black");
448
+
449
+ ch.addItem("Red");
450
+
451
+ ch.addItem("Blue");
452
+
453
+ ch.addItem("Green");
454
+
455
+ ch.addItem("Yellow");
456
+
457
+ ch.addItem("Gray");
458
+
459
+ ch.addItem("Pink");
460
+
461
+ ch.addActionListener(this);
462
+
463
+ add(ch);
464
+
465
+
466
+
467
+ JButton clearButton = new JButton("Clear");
468
+
469
+ clearButton.addActionListener(this);
470
+
471
+ add(clearButton);
472
+
473
+ }
474
+
475
+ // アクション処理
476
+
477
+ @Override
478
+
479
+ public void actionPerformed(ActionEvent e) {
480
+
481
+ if(e.getSource() instanceof JComboBox) {
482
+
483
+ String arg = (String)((JComboBox<?>)e.getSource()).getSelectedItem();
484
+
485
+ if(arg.equals("Black")) app.color=Color.BLACK;
486
+
487
+ else if(arg.equals("Red")) app.color=Color.RED;
488
+
489
+ else if(arg.equals("Blue")) app.color=Color.BLUE;
490
+
491
+ else if(arg.equals("Green")) app.color=Color.GREEN;
492
+
493
+ else if(arg.equals("Yellow")) app.color=Color.YELLOW;
494
+
495
+ else if(arg.equals("Gray")) app.color=Color.GRAY;
496
+
497
+ else if(arg.equals("Pink")) app.color=Color.PINK;
498
+
499
+ }
500
+
501
+ if(e.getSource() instanceof JButton) {
502
+
503
+ String arg = ((JButton)e.getSource()).getText();
504
+
505
+ if(arg.equals("Clear")) app.clear();
506
+
507
+ }
508
+
509
+ }
510
+
511
+ }
512
+
513
+
514
+
515
+ // JDrawCanvasクラス
516
+
517
+ class JDrawCanvas extends JPanel {
518
+
519
+ private JSimpleDrawMain app;
520
+
521
+ private Point p1, p2; // 描画中の始点と終点
522
+
523
+
524
+
525
+ // コンストラクタ
526
+
527
+ public JDrawCanvas(JSimpleDrawMain app) {
528
+
529
+ super(null);
530
+
531
+ this.app = app;
532
+
533
+ setBackground(Color.WHITE);
534
+
535
+
536
+
537
+ addMouseListener(new MouseAdapter() {
538
+
539
+ // マウスボタンが押された
540
+
541
+ @Override
542
+
543
+ public void mousePressed(MouseEvent e) {
544
+
545
+ Graphics g = getGraphics();
546
+
547
+ g.setXORMode(getBackground());
548
+
549
+ p2 = p1 = new Point(e.getX(), e.getY());
550
+
551
+ g.drawLine(p1.x, p1.y, p2.x, p2.y);
552
+
553
+ g.dispose();
554
+
555
+ }
556
+
557
+
558
+
559
+ // マウスボタンが離された
560
+
561
+ @Override
562
+
563
+ public void mouseReleased(MouseEvent e) {
564
+
565
+ Graphics g = getGraphics();
566
+
567
+ g.setXORMode(getBackground());
568
+
569
+ g.drawLine(p1.x, p1.y, p2.x, p2.y);
570
+
571
+ g.setPaintMode();
572
+
573
+ p2 = new Point(e.getX(), e.getY());
574
+
575
+ if(app.line_num < JSimpleDrawMain.LINEMAX) {
576
+
577
+ app.lines[app.line_num] = new Line(p1, p2, app.color);
578
+
579
+ app.lines[app.line_num++].draw(g);
580
+
581
+ }
582
+
583
+ g.dispose();
584
+
585
+ }
586
+
587
+ });
588
+
589
+
590
+
591
+ addMouseMotionListener(new MouseMotionAdapter() {
592
+
593
+ // マウスがドラッグされた
594
+
595
+ @Override
596
+
597
+ public void mouseDragged(MouseEvent e) {
598
+
599
+ Graphics g = getGraphics();
600
+
601
+ g.setXORMode(getBackground());
602
+
603
+ g.drawLine(p1.x, p1.y, p2.x, p2.y);
604
+
605
+ p2 = new Point(e.getX(), e.getY());
606
+
607
+ g.drawLine(p1.x, p1.y, p2.x, p2.y);
608
+
609
+ g.dispose();
610
+
611
+ }
612
+
613
+ });
614
+
615
+ }
616
+
617
+ // 再描画
618
+
619
+ public void paintComponent(Graphics g) {
620
+
621
+ super.paintComponent(g);
622
+
623
+ for(int i = 0; i < app.line_num; i++)
624
+
625
+ app.lines[i].draw(g);
626
+
627
+ }
628
+
629
+ }
630
+
631
+
632
+
633
+ public class JSimpleDrawMain extends JPanel {
634
+
635
+ static final int LINEMAX = 100; // 最大線数
636
+
637
+ int line_num; // 現在の線数
638
+
639
+ Line[] lines; // 線データ
640
+
641
+ Color color; // 現在の色
642
+
643
+ JDrawCanvas dc; // 描画キャンバス
644
+
645
+
646
+
647
+ // 初期化
648
+
649
+ public void init() {
650
+
651
+ setBackground(Color.white);
652
+
653
+ line_num = 0;
654
+
655
+ lines = new Line[LINEMAX];
656
+
657
+ color = Color.BLACK;
658
+
659
+ setLayout(new BorderLayout());
660
+
661
+ add(new JControlPanel(this), BorderLayout.SOUTH);
662
+
663
+ add(dc = new JDrawCanvas(this), BorderLayout.CENTER);
664
+
665
+ }
666
+
667
+
668
+
669
+ // メイン
670
+
671
+ public static void main(String[] args) {
672
+
673
+ JFrame f = new JFrame("JSimpleDrawMain");
674
+
675
+ f.setSize(400,300);
676
+
677
+ JSimpleDrawMain a = new JSimpleDrawMain();
678
+
679
+ f.add(a, BorderLayout.CENTER);
680
+
681
+ a.init();
682
+
683
+ f.setVisible(true);
684
+
685
+ }
686
+
687
+
688
+
689
+ // クリア
690
+
691
+ public void clear() {
692
+
693
+ line_num = 0;
694
+
695
+ dc.repaint();
696
+
697
+ }
698
+
699
+ }
700
+
701
+ ```

2

コード追加

2020/03/29 06:22

投稿

jimbe
jimbe

スコア12659

test CHANGED
@@ -11,3 +11,365 @@
11
11
  複数のプラモデルを組み合わせて新しいものを作ろうとするなら, 元のプラモデルの構造を理解している必要があるはずです.
12
12
 
13
13
  (「理解が及んでいないことは重々承知している」なればこそ)参考にされている記事・コードの理解を進めることをお勧めします.
14
+
15
+
16
+
17
+ #追加
18
+
19
+ リンク先の SimpleDraw02 を Swing 化するとこのような感じでしょうか.
20
+
21
+ なるべく元の状態を維持しつつ…と思ったのですが, 描画領域は専用クラス(CanvasPanel)にしないと面倒そうでしたので諦め, 各リスナも無名クラス化してしまいました.
22
+
23
+ ```java
24
+
25
+ //package teratail.q249928;
26
+
27
+
28
+
29
+ import java.awt.*;
30
+
31
+ import java.awt.event.*;
32
+
33
+ import java.util.ArrayList;
34
+
35
+ import java.util.List;
36
+
37
+
38
+
39
+ import javax.swing.*;
40
+
41
+
42
+
43
+ /**
44
+
45
+ * 線分情報クラス <p>
46
+
47
+ * 描画された1本の線分の情報を記憶しておくためのクラスです。
48
+
49
+ * 線分情報には、始点座標と終点座標とがあります。
50
+
51
+ */
52
+
53
+ class SegmentInfo {
54
+
55
+
56
+
57
+ /** 始点座標 */
58
+
59
+ private int x1, y1;
60
+
61
+
62
+
63
+ /** 終点座標 */
64
+
65
+ private int x2, y2;
66
+
67
+
68
+
69
+ /** 色 */
70
+
71
+ private Color color;
72
+
73
+
74
+
75
+ /** 始点と終点を与えて生成します。 */
76
+
77
+ SegmentInfo(int x1, int y1, int x2, int y2, Color color) {
78
+
79
+ this.x1 = x1;
80
+
81
+ this.y1 = y1;
82
+
83
+ this.x2 = x2;
84
+
85
+ this.y2 = y2;
86
+
87
+ this.color = color;
88
+
89
+ }
90
+
91
+
92
+
93
+ /** 自分自身を描画します。 */
94
+
95
+ void draw(Graphics g) {
96
+
97
+ g.setColor(color);
98
+
99
+ g.drawLine(x1, y1, x2, y2);
100
+
101
+ }
102
+
103
+ }
104
+
105
+
106
+
107
+ class CanvasPanel extends JPanel {
108
+
109
+ /** 線分の描画のための座標. */
110
+
111
+ private int lx1, ly1, lx2, ly2;
112
+
113
+
114
+
115
+ /** 線分情報を記憶しておくためのベクトル. */
116
+
117
+ private List<SegmentInfo> data = new ArrayList<SegmentInfo>();
118
+
119
+
120
+
121
+ private Color color = new Color(100,255,100);
122
+
123
+
124
+
125
+ CanvasPanel() {
126
+
127
+ super(null);
128
+
129
+ setBackground(Color.WHITE);
130
+
131
+
132
+
133
+ addMouseListener(new MouseAdapter() {
134
+
135
+ /**
136
+
137
+ * マウスボタンが押されると、その後のマウスの動きを追跡して仮の線を引く必要があります。
138
+
139
+ */
140
+
141
+ @Override
142
+
143
+ public void mousePressed(MouseEvent e) {
144
+
145
+ lx1 = lx2 = e.getX();
146
+
147
+ ly1 = ly2 = e.getY();
148
+
149
+ drawXORLine();
150
+
151
+ }
152
+
153
+
154
+
155
+ /**
156
+
157
+ * マウスボタンが離されると、以前の仮の線を消して、確定した直線を描きます。
158
+
159
+ */
160
+
161
+ @Override
162
+
163
+ public void mouseReleased(MouseEvent e) {
164
+
165
+ drawXORLine();
166
+
167
+ lx2 = e.getX();
168
+
169
+ ly2 = e.getY();
170
+
171
+ data.add(new SegmentInfo(lx1, ly1, lx2, ly2, color));
172
+
173
+ repaint();
174
+
175
+ }
176
+
177
+ });
178
+
179
+
180
+
181
+ addMouseMotionListener(new MouseMotionAdapter() {
182
+
183
+ /**
184
+
185
+ * マウスがドラッグされると、それまでの仮の線を消して、新しい仮の線を描きます。
186
+
187
+ */
188
+
189
+ @Override
190
+
191
+ public void mouseDragged(MouseEvent e) {
192
+
193
+ drawXORLine();
194
+
195
+ lx2 = e.getX();
196
+
197
+ ly2 = e.getY();
198
+
199
+ drawXORLine();
200
+
201
+ }
202
+
203
+ });
204
+
205
+ }
206
+
207
+
208
+
209
+ /** 仮の線分の描画. */
210
+
211
+ private void drawXORLine() {
212
+
213
+ // XORモードで仮の線分を描画します。
214
+
215
+ // XORモードで描かれた線分は、再度同じ線分を描画すると消えます。
216
+
217
+ Graphics g = getGraphics();
218
+
219
+ g.setXORMode(getBackground());
220
+
221
+ g.drawLine(lx1, ly1, lx2, ly2);
222
+
223
+ g.dispose();
224
+
225
+ }
226
+
227
+
228
+
229
+ /** すべての線分を描画します。 */
230
+
231
+ @Override
232
+
233
+ public void paintComponent(Graphics g) {
234
+
235
+ super.paintComponent(g);
236
+
237
+ for(SegmentInfo e : data) e.draw(g);
238
+
239
+ }
240
+
241
+
242
+
243
+ /** 全データを消して、再描画します。 */
244
+
245
+ void clear() {
246
+
247
+ data.clear();
248
+
249
+ repaint();
250
+
251
+ }
252
+
253
+ }
254
+
255
+
256
+
257
+ public class SimpleDraw02 extends JFrame {
258
+
259
+
260
+
261
+ public SimpleDraw02() {
262
+
263
+ super("SimpleDraw ver 0.2(Swing)");
264
+
265
+ setSize(1000, 1000);
266
+
267
+ setLocationRelativeTo(null);
268
+
269
+
270
+
271
+ setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
272
+
273
+ addWindowListener(new WindowAdapter() {
274
+
275
+ @Override
276
+
277
+ public void windowClosing(WindowEvent e) {
278
+
279
+ quit();
280
+
281
+ }
282
+
283
+ });
284
+
285
+
286
+
287
+ CanvasPanel canvas = new CanvasPanel();
288
+
289
+ add(canvas, BorderLayout.CENTER);
290
+
291
+
292
+
293
+ JPanel eastPanel = new JPanel(new FlowLayout());
294
+
295
+ add(eastPanel, BorderLayout.EAST);
296
+
297
+
298
+
299
+ JButton quitButton = new JButton("Quit");
300
+
301
+ quitButton.addActionListener(new ActionListener() {
302
+
303
+ /** Quit ボタンが押されたときの処理を行います。 */
304
+
305
+ @Override
306
+
307
+ public void actionPerformed(ActionEvent e) {
308
+
309
+ quit();
310
+
311
+ }
312
+
313
+ });
314
+
315
+ eastPanel.add(quitButton);
316
+
317
+
318
+
319
+ JButton clearButton = new JButton("Clear");
320
+
321
+ clearButton.addActionListener(new ActionListener() {
322
+
323
+ /** Clear ボタンが押されたときの処理を行います。 */
324
+
325
+ @Override
326
+
327
+ public void actionPerformed(ActionEvent e) {
328
+
329
+ canvas.clear();
330
+
331
+ }
332
+
333
+ });
334
+
335
+ eastPanel.add(clearButton);
336
+
337
+ }
338
+
339
+
340
+
341
+ /**
342
+
343
+ * プログラムを終了します。
344
+
345
+ * 終了にはいくつかの方法がありますが、すべてここでその処理を行うことで、動作の統一を図ります。
346
+
347
+ */
348
+
349
+ void quit() {
350
+
351
+ System.exit(0);
352
+
353
+ }
354
+
355
+
356
+
357
+ /**
358
+
359
+ * クラスを直接実行すると、このメソッドから開始されます。
360
+
361
+ * ここでは、クラス自身のインスタンスを作ってそれを表示しています。
362
+
363
+ * これにより、クラスの実行が開始されます。
364
+
365
+ */
366
+
367
+ public static void main(String[] args) {
368
+
369
+ new SimpleDraw02().setVisible(true);
370
+
371
+ }
372
+
373
+ }
374
+
375
+ ```

1

追加

2020/03/28 12:26

投稿

jimbe
jimbe

スコア12659

test CHANGED
@@ -10,4 +10,4 @@
10
10
 
11
11
  複数のプラモデルを組み合わせて新しいものを作ろうとするなら, 元のプラモデルの構造を理解している必要があるはずです.
12
12
 
13
- 参考にされている記事・コードの理解を進めることをお勧めします.
13
+ (「理解が及んでいないことは重々承知している」なればこそ)参考にされている記事・コードの理解を進めることをお勧めします.