Code
class ProgressCircleUI extends BasicProgressBarUI {
@Override public Dimension getPreferredSize(JComponent c) {
Dimension d = super.getPreferredSize(c);
int v = Math.max(d.width, d.height);
d.setSize(v, v);
return d;
}
@Override public void paint(Graphics g, JComponent c) {
Insets b = progressBar.getInsets(); // area for border
int barRectWidth = progressBar.getWidth() - b.right - b.left;
int barRectHeight = progressBar.getHeight() - b.top - b.bottom;
if (barRectWidth <= 0 || barRectHeight <= 0) {
return;
}
// draw the cells
Graphics2D g2 = (Graphics2D) g.create();
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
double degree = 360 * progressBar.getPercentComplete();
double sz = Math.min(barRectWidth, barRectHeight);
double cx = b.left + barRectWidth * .5;
double cy = b.top + barRectHeight * .5;
double or = sz * .5;
double ir = or * .5; //or - 20;
Shape inner = new Ellipse2D.Double(cx - ir, cy - ir, ir * 2, ir * 2);
Shape outer = new Ellipse2D.Double(cx - or, cy - or, sz, sz);
Shape sector = new Arc2D.Double(
cx - or, cy - or, sz, sz, 90 - degree, degree, Arc2D.PIE);
Area foreground = new Area(sector);
Area background = new Area(outer);
Area hole = new Area(inner);
foreground.subtract(hole);
background.subtract(hole);
g2.setPaint(new Color(0xDDDDDD));
g2.fill(background);
g2.setPaint(progressBar.getForeground());
g2.fill(foreground);
g2.dispose();
// Deal with possible text painting
if (progressBar.isStringPainted()) {
paintString(g, b.left, b.top, barRectWidth, barRectHeight, 0, b);
}
}
}
// ...
JProgressBar progress = new JProgressBar();
progress.setUI(new ProgressCircleUI());
progress.setBorder(BorderFactory.createEmptyBorder(8, 8, 8, 8));
progress.setStringPainted(true);
progress.setFont(progress.getFont().deriveFont(24f));
progress.setForeground(Color.ORANGE);
(new Timer(50, e -> {
int iv = Math.min(100, progress.getValue() + 1);
progress.setValue(iv);
})).start();
References
can you show how can i use this with a jframe?
ReplyDeleteThis could help :-)
Deletehow to use it?
ReplyDeleteHi, Rafly
DeleteTake a look at How to create a circular progress component in java swing - Stack Overflow
May be it helps.
How to run the file named MainPanel.java given in the src.zip file?
ReplyDeleteIts gives error as Error: Could not find or load main class MainPanel.
Hi Maheshwari,
DeleteYou may need to to call java -cp . example.MainPanel from the parent directionry of example.
reference: Java error Could not find or load main class package - Stack Overflow
How do i change the color of the 64% label inside the blue circular progress bar. I just want to change the color of the text (64%). Thanks.
ReplyDeleteYou might be able to use UIManager.put("ProgressBar.selectionBackground", Color.ORANGE); or override the BasicProgressBarUI#getSelectionBackground() method:
Delete// ...
// Deal with possible text painting
if (progressBar.isStringPainted()) {
paintString(g, b.left, b.top, barRectWidth, barRectHeight, 0, b);
}
}
@Override protected Color getSelectionBackground() {
return Color.RED;
}