An example of how to paint a roulette wheel:
import javax.swing.*;
import java.awt.*;
import java.awt.geom.*;
class RouletteDrawTest
{
public static void main(String args[])
{
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final RoulettePanel p = new RoulettePanel();
Thread thread = new Thread(new Runnable()
{
public void run()
{
double angle = 0;
while (true)
{
p.setRotationAngle(angle);
angle += 0.01;
try
{
Thread.sleep(20);
}
catch (InterruptedException e)
{
Thread.currentThread().interrupt();
return;
}
}
}
});
thread.start();
f.getContentPane().add(p);
f.setSize(600, 600);
f.setVisible(true);
}
});
}
}
class RoulettePanel extends JPanel
{
private static final int numbers[] = new int[]
{ 0, 32, 15, 19, 4, 21, 2, 25, 17, 34, 6, 27, 13, 36, 11, 30, 8, 23, 10, 5,
24, 16, 33, 1, 20, 14, 31, 9, 22, 18, 29, 7, 28, 12, 35, 3, 26 };
private double rotationAngleRad = 0.0;
public void setRotationAngle(double angleRad)
{
this.rotationAngleRad = angleRad;
repaint();
}
public void paintComponent(Graphics gr)
{
super.paintComponent(gr);
Graphics2D g = (Graphics2D) gr;
int w = getWidth();
int h = getHeight();
g.setColor(Color.WHITE);
g.fillRect(0, 0, w, h);
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
int offsetX = 20;
int offsetY = 20;
int diameter = Math.min(w - 2 * offsetX, h - 2 * offsetY);
int radius = diameter / 2;
int centerX = offsetX + radius;
int centerY = offsetY + radius;
int fontSize = (int) (radius * 0.1);
Font font = new Font("Serif", Font.BOLD, fontSize);
g.setFont(font);
FontMetrics fontMetrics = g.getFontMetrics();
int fontHeight = fontMetrics.getHeight();
double angleRadDelta = Math.PI * 2 / numbers.length;
Path2D segment = createSegment(centerX, centerY, radius - fontHeight,
radius, -angleRadDelta / 2, angleRadDelta / 2);
AffineTransform originalAT = g.getTransform();
for (int i = 0; i < numbers.length; i++)
{
double angleRad0 = rotationAngleRad + i * angleRadDelta;
g.setTransform(originalAT);
g.rotate(angleRad0, centerX, centerY);
if (i == 0)
{
g.setColor(new Color(0, 192, 0));
}
else if ((i & 1) == 1)
{
g.setColor(Color.RED);
}
else
{
g.setColor(Color.DARK_GRAY);
}
g.fill(segment);
String numberString = String.valueOf(numbers[i]);
int delta = fontMetrics.stringWidth(numberString) / 2;
g.setColor(Color.WHITE);
g.drawString(numberString, centerX - delta,
centerY - radius + fontHeight - fontMetrics.getDescent());
}
g.setTransform(originalAT);
}
private static Path2D createSegment(int centerX, int centerY,
int innerRadius, int outerRadius, double angleRad0, double angleRad1)
{
Arc2D.Double arcInner =
new Arc2D.Double(centerX - innerRadius, centerY - innerRadius,
innerRadius * 2, innerRadius * 2, Math.toDegrees(angleRad0),
Math.toDegrees(angleRad1 - angleRad0), Arc2D.OPEN);
Arc2D.Double arcOuter =
new Arc2D.Double(centerX - outerRadius, centerY - outerRadius,
outerRadius * 2, outerRadius * 2, Math.toDegrees(angleRad1),
Math.toDegrees(angleRad0 - angleRad1), Arc2D.OPEN);
Path2D.Double path = new Path2D.Double();
path.append(arcInner, true);
path.append(arcOuter, true);
path.closePath();
AffineTransform at =
AffineTransform.getRotateInstance(-Math.PI / 2, centerX, centerY);
path.transform(at);
return path;
}
}