Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
package com.baeldung.drawcircle;

import javax.swing.*;
import java.awt.*;
import java.awt.geom.Ellipse2D;
import java.awt.image.BufferedImage;

public class DrawBufferedCircle {

public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
JFrame f = new JFrame("Circle");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.add(new CircleImagePanel(64, 3)); // final size: 64x64, supersample: 3x
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
});
}

static class CircleImagePanel extends JPanel {
private final int finalSize;
private final BufferedImage circleImage;

public CircleImagePanel(int finalSize, int scale) {
this.finalSize = finalSize;
this.circleImage = makeCircleImage(finalSize, scale);
setPreferredSize(new Dimension(finalSize + 16, finalSize + 16));
setBackground(Color.WHITE);
}

@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g.create();
try {
int x = (getWidth() - finalSize) / 2;
int y = (getHeight() - finalSize) / 2;

g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
RenderingHints.VALUE_INTERPOLATION_BICUBIC);

g2.drawImage(circleImage, x, y, finalSize, finalSize, null);
} finally {
g2.dispose();
}
}

private BufferedImage makeCircleImage(int finalSize, int scale) {
int hi = finalSize * scale;
BufferedImage img = new BufferedImage(hi, hi, BufferedImage.TYPE_INT_ARGB);
Graphics2D g2 = img.createGraphics();
try {
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g2.setRenderingHint(RenderingHints.KEY_RENDERING,
RenderingHints.VALUE_RENDER_QUALITY);
g2.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL,
RenderingHints.VALUE_STROKE_PURE);

g2.setComposite(AlphaComposite.Src);

float stroke = 6f * scale / 3f;
double diameter = hi - stroke - (4 * scale);
double x = (hi - diameter) / 2.0;
double y = (hi - diameter) / 2.0;

Shape circle = new Ellipse2D.Double(x, y, diameter, diameter);

g2.setPaint(new Color(0xBBDEFB));
g2.fill(circle);

g2.setPaint(new Color(0x0D47A1));
g2.setStroke(new BasicStroke(stroke, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND));
g2.draw(circle);

} finally {
g2.dispose();
}
return img;
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
package com.baeldung.drawcircle;

import java.awt.*;
import java.awt.geom.Ellipse2D;
import javax.swing.*;

public class DrawCircle extends JPanel {
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);

Graphics2D g2 = (Graphics2D) g.create();
try {
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE);
g2.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);

float stroke = 2f;
double diameter = Math.min(getWidth(), getHeight()) - 12; // padding
double x = (getWidth() - diameter) / 2.0;
double y = (getHeight() - diameter) / 2.0;

Ellipse2D circle = new Ellipse2D.Double(x, y, diameter, diameter);

g2.setColor(new Color(0xBBDEFB));
g2.fill(circle);

g2.setColor(new Color(0x0D47A1));
g2.setStroke(new BasicStroke(stroke, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND));
g2.draw(circle);
} finally {
g2.dispose();
}
}

public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
JFrame f = new JFrame("Circle");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.add(new DrawCircle());
f.setSize(320, 240);
f.setLocationRelativeTo(null);
f.setVisible(true);
});
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
package com.baeldung.drawcircle;

import javax.swing.*;
import java.awt.*;
import java.awt.geom.Ellipse2D;
import java.awt.image.BufferedImage;

public class DrawSupersampledCircle {

public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
JFrame f = new JFrame("SupersampledCircle");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.add(new CirclePanel());
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
});
}

static class CirclePanel extends JPanel {
private final BufferedImage hiResImage;
private final int finalSize = 6;

public CirclePanel() {
int scale = 3;
float stroke = 6f;

hiResImage = makeSupersampledCircle(scale, stroke);
setPreferredSize(new Dimension(finalSize + 32, finalSize + 32));
setBackground(Color.WHITE);
}

@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g.create();
try {
int x = (getWidth() - finalSize) / 2;
int y = (getHeight() - finalSize) / 2;

g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION,
RenderingHints.VALUE_INTERPOLATION_BICUBIC);

g2.drawImage(hiResImage, x, y, finalSize, finalSize, null);
} finally {
g2.dispose();
}
}

private BufferedImage makeSupersampledCircle(int scale, float stroke) {
int hi = finalSize * scale;
BufferedImage img = new BufferedImage(hi, hi, BufferedImage.TYPE_INT_ARGB);
Graphics2D g2 = img.createGraphics();
try {
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_PURE);
g2.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);

double d = hi - stroke;
Shape circle = new Ellipse2D.Double(stroke / 2.0, stroke / 2.0, d, d);

g2.setPaint(new Color(0xBBDEFB));
g2.fill(circle);

g2.setPaint(new Color(0x0D47A1));
g2.setStroke(new BasicStroke(stroke, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND));
g2.draw(circle);
} finally {
g2.dispose();
}
return img;
}
}
}