-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathMyCanvas.java
121 lines (98 loc) · 3 KB
/
MyCanvas.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
import java.awt.*;
import java.awt.font.FontRenderContext;
import java.awt.font.LineMetrics;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Line2D;
import java.util.ArrayList;
import javax.swing.BorderFactory;
import javax.swing.JPanel;
class MyCanvas extends JPanel implements Observer{
public ArrayList<Integer> data = new ArrayList<Integer>();
boolean join = true;
boolean point = true;
boolean label = false;
final int PAD = 40;
private Graphics2D g2;
public void nullData() { // is required for cleaning
this.data = null;
}
public MyCanvas() {
setBorder(BorderFactory.createEtchedBorder());
setBackground(Color.white);
}
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g2 = (Graphics2D) g;
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
int w = getWidth();
int h = getHeight();
// y-axis
g2.draw(new Line2D.Double(PAD, PAD, PAD, h - PAD));
// x-axis
g2.draw(new Line2D.Double(PAD, h - PAD, w - PAD, h - PAD));
double xInc = PAD, scale = 0;
// label-maker
Font font = g2.getFont();
FontRenderContext frc = g2.getFontRenderContext();
LineMetrics lm = font.getLineMetrics("0", frc);
float sh = lm.getAscent() + lm.getDescent();
// y-label
String ylabel = "y-axis";
float sy = PAD + ((h - 2 * PAD) - ylabel.length() * sh) / 2
+ lm.getAscent();
for (int i = 0; i < ylabel.length(); i++) {
String letter = String.valueOf(ylabel.charAt(i));
float sw = (float) font.getStringBounds(letter, frc).getWidth();
float sx = (PAD - sw) / 2;
g2.drawString(letter, sx, sy);
sy += sh;
}
// x-label
String xlabel = "x-axis";
sy = h - PAD + (PAD - sh) / 2 + lm.getAscent();
float sw = (float) font.getStringBounds(xlabel, frc).getWidth();
float sx = (w - sw) / 2;
g2.drawString(xlabel, sx, sy);
double x, y, x_ = 0, y_ = 0;
if (data.size() > 1) // if data set contains only one data
xInc = (double) (w - 2 * PAD) / (data.size() - 1);
if (getMax() > 0) // if the data set contains only zero
scale = (double) (h - 2 * PAD) / getMax();
// Mark data points.
for (int i = 0; i < data.size(); i++) {
x = PAD + i * xInc;
y = h - PAD - scale * data.get(i);
if (point) {
g2.setPaint(Color.red);
g2.fill(new Ellipse2D.Double(x - 2, y - 2, 4, 4));
}
if (join) {
if (i < data.size() - 1) {
x_ = PAD + (i + 1) * xInc;
y_ = h - PAD - scale * data.get(i + 1);
}
g2.setPaint(Color.green.darker());
if (data.size() > 1) // draw line only if more than one data
g2.draw(new Line2D.Double(x, y, x_, y_));
}
if (label) {
String l = "(" + String.valueOf(i) + ",";
l += String.valueOf(data.get(i)) + ")";
g2.setPaint(Color.black);
g2.drawString(l, (float) x + 3, (float) y - 3);
}
}
}
private int getMax() {
int max = -Integer.MAX_VALUE;
for (int i = 0; i < data.size(); i++) {
if (data.get(i) > max)
max = data.get(i);
}
return max;
}
public void dataUpdate(Data d) {
repaint();
}
}