Code
private final String[] arabicNumerals = {
"12", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11"
};
private final String[] romanNumerals = {
"XII", "I", "II", "III", "IIII", "V", "VI", "VII", "VIII", "IX", "X", "XI"
};
private void paintClockNumbers(
Graphics2D g2, double radius, double hourMarkerLen) {
AffineTransform at = AffineTransform.getRotateInstance(0d);
g2.setColor(Color.WHITE);
Font font = g2.getFont();
FontRenderContext frc = g2.getFontRenderContext();
if (isRomanNumerals) {
AffineTransform si = AffineTransform.getScaleInstance(1d, 2d);
for (String txt : romanNumerals) {
Shape s = getTextLayout(txt, font, frc).getOutline(si);
Rectangle2D r = s.getBounds2D();
double tx = r.getCenterX();
double ty = radius - hourMarkerLen - r.getHeight() + r.getCenterY() * .5;
Shape t = AffineTransform.getTranslateInstance(-tx, -ty)
.createTransformedShape(s);
g2.fill(at.createTransformedShape(t));
at.rotate(Math.PI / 6d);
}
} else {
Point2D ptSrc = new Point2D.Double();
for (String txt : arabicNumerals) {
Shape s = getTextLayout(txt, font, frc).getOutline(null);
Rectangle2D r = s.getBounds2D();
double ty = radius - hourMarkerLen - r.getHeight() - r.getCenterY() * .5;
ptSrc.setLocation(0d, -ty);
Point2D pt = at.transform(ptSrc, null);
double dx = pt.getX() - r.getCenterX();
double dy = pt.getY() - r.getCenterY();
// g2.drawString(txt, (float) dx, (float) dy);
g2.fill(AffineTransform.getTranslateInstance(dx, dy)
.createTransformedShape(s));
at.rotate(Math.PI / 6d);
}
}
}
private static TextLayout getTextLayout(
String txt, Font font, FontRenderContext frc) {
return new TextLayout(txt, font, frc);
}
References