以下コードです
(悪コードだったので削除させていただきました。修正版の方をお読みください。)
(これも悪コードかもしれませんが)
修正版
Java
1import java.awt.BorderLayout;
2import java.awt.Color;
3import java.awt.Graphics;
4import java.awt.Point;
5import java.awt.event.MouseEvent;
6import java.awt.event.MouseListener;
7
8import javax.swing.JFrame;
9import javax.swing.JPanel;
10
11public class PaintTriangle extends JFrame {
12
13 class mouseEvent implements MouseListener {
14
15 int time = 0;
16 Point point[] = new Point[3];
17
18 @Override
19 public void mouseClicked(MouseEvent e) {}
20
21 @Override
22 public void mouseEntered(MouseEvent e) {}
23
24 @Override
25 public void mouseExited(MouseEvent e) {}
26
27 @Override
28 public void mousePressed(MouseEvent e) {
29 Graphics g = getGraphics();
30 time++;
31
32 if (time == 4) {
33 time = 0;
34 repaint();
35 } else {
36 point[time - 1] = e.getPoint();
37 g.drawLine(e.getX(), e.getY(), e.getX(), e.getY());
38 if (time == 3) {
39 g.drawLine((int) point[0].getX(), (int) point[0].getY(), (int) point[1].getX(), (int) point[1].getY());
40 g.drawLine((int) point[1].getX(), (int) point[1].getY(), (int) point[2].getX(), (int) point[2].getY());
41 g.drawLine((int) point[2].getX(), (int) point[2].getY(), (int) point[0].getX(), (int) point[0].getY());
42 }
43 }
44
45 }
46
47 @Override
48 public void mouseReleased(MouseEvent e) {}
49
50 }
51
52 public static void main(String[] args) {
53 new PaintTriangle("三角形の描画");
54 }
55
56 PaintTriangle(String title) {
57 setTitle(title);
58 setBounds(100, 100, 300, 200);
59 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
60 setVisible(true);
61 JPanel panel = new JPanel();
62 panel.setBackground(Color.yellow);
63 add(panel, BorderLayout.CENTER);
64 addMouseListener(new mouseEvent());
65 }
66}
67
やっていること
- mousePressedから押した座標を取得する
- drawLine(startX, startY, endX, endY)で描画する(点ならstartXとendX,startYとendYは同じにする)
- mouseEventクラス内にtime(int型)を用意し、何回クリックしたかを記録している
質問者さんはJPanel(ExPanel)の方にaddMouseListner()としていたようですが縦に30、横に10ほどずれが生じます。(故に最初変なコードになったわけですが)
KSwordOfHasteさんが仰る通り、mousePressedはマウス1回のクリックにつき1度行われます。
if (time == 3) {
g.drawLine((int) point[0].getX(), (int) point[0].getY(), (int) point[1].getX(), (int) point[1].getY());
g.drawLine((int) point[1].getX(), (int) point[1].getY(), (int) point[2].getX(), (int) point[2].getY());
g.drawLine((int) point[2].getX(), (int) point[2].getY(), (int) point[0].getX(), (int) point[0].getY());
}
(僕のコード)ここについては、全てint型にキャストしているのですが、ここはあまり良くないコードかと思いました。下のコードの方が良いかもしれません。(これもわざわざDotクラスを作っているのでどちらが良いのかはわかりませんが)
Java
1import java.awt.BorderLayout;
2import java.awt.Color;
3import java.awt.Graphics;
4import java.awt.event.MouseEvent;
5import java.awt.event.MouseListener;
6
7import javax.swing.JFrame;
8import javax.swing.JPanel;
9
10public class PaintTriangle extends JFrame {
11
12 class Dot {
13
14 private int x, y;
15
16 Dot() {
17 x = 0;
18 y = 0;
19 }
20
21 Dot(int x, int y) {
22 this.x = x;
23 this.y = y;
24 }
25
26 public int getX() {
27 return x;
28 }
29
30 public int getY() {
31 return y;
32 }
33 }
34
35 class mouseEvent implements MouseListener {
36
37 int time = 0;
38 Dot dot[] = new Dot[3];
39
40 @Override
41 public void mouseClicked(MouseEvent e) {}
42
43 @Override
44 public void mouseEntered(MouseEvent e) {}
45
46 @Override
47 public void mouseExited(MouseEvent e) {}
48
49 @Override
50 public void mousePressed(MouseEvent e) {
51 Graphics g = getGraphics();
52 time++;
53
54 if (time == 4) {
55 time = 0;
56 repaint();
57 } else {
58 dot[time - 1] = new Dot(e.getX(), e.getY());
59 g.drawLine(e.getX(), e.getY(), e.getX(), e.getY());
60 if (time == 3) {
61 g.drawLine(dot[0].getX(), dot[0].getY(), dot[1].getX(), dot[1].getY());
62 g.drawLine(dot[1].getX(), dot[1].getY(), dot[2].getX(), dot[2].getY());
63 g.drawLine(dot[2].getX(), dot[2].getY(), dot[0].getX(), dot[0].getY());
64 }
65 }
66
67 }
68
69 @Override
70 public void mouseReleased(MouseEvent e) {}
71
72 }
73
74 public static void main(String[] args) {
75 new PaintTriangle("三角形の描画");
76 }
77
78 PaintTriangle(String title) {
79 setTitle(title);
80 setBounds(100, 100, 300, 200);
81 setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
82 setVisible(true);
83 JPanel panel = new JPanel();
84 panel.setBackground(Color.yellow);
85 add(panel, BorderLayout.CENTER);
86 addMouseListener(new mouseEvent());
87 }
88}
89
ところで僕の知識不足なのですが、
g.setColor(Color.blue);
g.fillOval(x,y,10,10);
この部分は何のために書いたのでしょうか?
僕にはわからなかったのですが、後学のために教えていただきたいと思っています。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。