Skip to content

Commit 8d87594

Browse files
authored
Draw a circle in different ways (#18912)
1 parent 1bd160f commit 8d87594

File tree

3 files changed

+204
-0
lines changed

3 files changed

+204
-0
lines changed
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
package com.baeldung.drawcircle;
2+
3+
import javax.swing.*;
4+
import java.awt.*;
5+
import java.awt.geom.Ellipse2D;
6+
import java.awt.image.BufferedImage;
7+
8+
public class DrawBufferedCircle {
9+
10+
public static void main(String[] args) {
11+
SwingUtilities.invokeLater(() -> {
12+
JFrame f = new JFrame("Circle");
13+
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
14+
f.add(new CircleImagePanel(64, 3)); // final size: 64x64, supersample: 3x
15+
f.pack();
16+
f.setLocationRelativeTo(null);
17+
f.setVisible(true);
18+
});
19+
}
20+
21+
static class CircleImagePanel extends JPanel {
22+
private final int finalSize;
23+
private final BufferedImage circleImage;
24+
25+
public CircleImagePanel(int finalSize, int scale) {
26+
this.finalSize = finalSize;
27+
this.circleImage = makeCircleImage(finalSize, scale);
28+
setPreferredSize(new Dimension(finalSize + 16, finalSize + 16));
29+
setBackground(Color.WHITE);
30+
}
31+
32+
@Override
33+
protected void paintComponent(Graphics g) {
34+
super.paintComponent(g);
35+
Graphics2D g2 = (Graphics2D) g.create();
36+
try {
37+
int x = (getWidth() - finalSize) / 2;
38+
int y = (getHeight() - finalSize) / 2;
39+
40+
g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
41+
RenderingHints.VALUE_INTERPOLATION_BICUBIC);
42+
43+
g2.drawImage(circleImage, x, y, finalSize, finalSize, null);
44+
} finally {
45+
g2.dispose();
46+
}
47+
}
48+
49+
private BufferedImage makeCircleImage(int finalSize, int scale) {
50+
int hi = finalSize * scale;
51+
BufferedImage img = new BufferedImage(hi, hi, BufferedImage.TYPE_INT_ARGB);
52+
Graphics2D g2 = img.createGraphics();
53+
try {
54+
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
55+
RenderingHints.VALUE_ANTIALIAS_ON);
56+
g2.setRenderingHint(RenderingHints.KEY_RENDERING,
57+
RenderingHints.VALUE_RENDER_QUALITY);
58+
g2.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL,
59+
RenderingHints.VALUE_STROKE_PURE);
60+
61+
g2.setComposite(AlphaComposite.Src);
62+
63+
float stroke = 6f * scale / 3f;
64+
double diameter = hi - stroke - (4 * scale);
65+
double x = (hi - diameter) / 2.0;
66+
double y = (hi - diameter) / 2.0;
67+
68+
Shape circle = new Ellipse2D.Double(x, y, diameter, diameter);
69+
70+
g2.setPaint(new Color(0xBBDEFB));
71+
g2.fill(circle);
72+
73+
g2.setPaint(new Color(0x0D47A1));
74+
g2.setStroke(new BasicStroke(stroke, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND));
75+
g2.draw(circle);
76+
77+
} finally {
78+
g2.dispose();
79+
}
80+
return img;
81+
}
82+
}
83+
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package com.baeldung.drawcircle;
2+
3+
import java.awt.*;
4+
import java.awt.geom.Ellipse2D;
5+
import javax.swing.*;
6+
7+
public class DrawCircle extends JPanel {
8+
@Override
9+
protected void paintComponent(Graphics g) {
10+
super.paintComponent(g);
11+
12+
Graphics2D g2 = (Graphics2D) g.create();
13+
try {
14+
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
15+
g2.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE);
16+
g2.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
17+
18+
float stroke = 2f;
19+
double diameter = Math.min(getWidth(), getHeight()) - 12; // padding
20+
double x = (getWidth() - diameter) / 2.0;
21+
double y = (getHeight() - diameter) / 2.0;
22+
23+
Ellipse2D circle = new Ellipse2D.Double(x, y, diameter, diameter);
24+
25+
g2.setColor(new Color(0xBBDEFB));
26+
g2.fill(circle);
27+
28+
g2.setColor(new Color(0x0D47A1));
29+
g2.setStroke(new BasicStroke(stroke, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND));
30+
g2.draw(circle);
31+
} finally {
32+
g2.dispose();
33+
}
34+
}
35+
36+
public static void main(String[] args) {
37+
SwingUtilities.invokeLater(() -> {
38+
JFrame f = new JFrame("Circle");
39+
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
40+
f.add(new DrawCircle());
41+
f.setSize(320, 240);
42+
f.setLocationRelativeTo(null);
43+
f.setVisible(true);
44+
});
45+
}
46+
}
Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
package com.baeldung.drawcircle;
2+
3+
import javax.swing.*;
4+
import java.awt.*;
5+
import java.awt.geom.Ellipse2D;
6+
import java.awt.image.BufferedImage;
7+
8+
public class DrawSupersampledCircle {
9+
10+
public static void main(String[] args) {
11+
SwingUtilities.invokeLater(() -> {
12+
JFrame f = new JFrame("SupersampledCircle");
13+
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
14+
f.add(new CirclePanel());
15+
f.pack();
16+
f.setLocationRelativeTo(null);
17+
f.setVisible(true);
18+
});
19+
}
20+
21+
static class CirclePanel extends JPanel {
22+
private final BufferedImage hiResImage;
23+
private final int finalSize = 6;
24+
25+
public CirclePanel() {
26+
int scale = 3;
27+
float stroke = 6f;
28+
29+
hiResImage = makeSupersampledCircle(scale, stroke);
30+
setPreferredSize(new Dimension(finalSize + 32, finalSize + 32));
31+
setBackground(Color.WHITE);
32+
}
33+
34+
@Override
35+
protected void paintComponent(Graphics g) {
36+
super.paintComponent(g);
37+
Graphics2D g2 = (Graphics2D) g.create();
38+
try {
39+
int x = (getWidth() - finalSize) / 2;
40+
int y = (getHeight() - finalSize) / 2;
41+
42+
g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
43+
RenderingHints.VALUE_INTERPOLATION_BICUBIC);
44+
45+
g2.drawImage(hiResImage, x, y, finalSize, finalSize, null);
46+
} finally {
47+
g2.dispose();
48+
}
49+
}
50+
51+
private BufferedImage makeSupersampledCircle(int scale, float stroke) {
52+
int hi = finalSize * scale;
53+
BufferedImage img = new BufferedImage(hi, hi, BufferedImage.TYPE_INT_ARGB);
54+
Graphics2D g2 = img.createGraphics();
55+
try {
56+
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
57+
g2.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE);
58+
g2.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
59+
60+
double d = hi - stroke;
61+
Shape circle = new Ellipse2D.Double(stroke / 2.0, stroke / 2.0, d, d);
62+
63+
g2.setPaint(new Color(0xBBDEFB));
64+
g2.fill(circle);
65+
66+
g2.setPaint(new Color(0x0D47A1));
67+
g2.setStroke(new BasicStroke(stroke, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND));
68+
g2.draw(circle);
69+
} finally {
70+
g2.dispose();
71+
}
72+
return img;
73+
}
74+
}
75+
}

0 commit comments

Comments
 (0)