import java.awt.*; import java.awt.event.*; import java.awt.geom.*; /** * A demo class that illustrates drawing text * along the outside of a circle. */ public class CircleTextDemo extends Canvas { Frame myframe; TextField text; Button printBtn; Font myfont; Color textcolor; Color circlecolor; /** * Create a CircleTextDemo canvas and frame * with default settings. */ public CircleTextDemo() { this("Serif", Font.PLAIN, 18, Color.pink, Color.black); } /** * Create a CircleTextDemo canvas and frame * with supplied settings. * * @param ff Font family (usually "Serif") * @param fs Font style (usually Font.PLAIN) * @param fz Font size (usually 18) * @param bg Background color for this canvas (usually pink) * @param fg Foreground color for text (usually black) */ public CircleTextDemo(String ff, int fs, int fz, Color bg, Color fg) { setBackground(bg); circlecolor = bg.brighter(); textcolor = fg; myfont = new Font(ff, fs, fz); text = new TextField("Text on a circle using Java 2D Graphics!"); myframe = new Frame("CircleTextDemo"); printBtn = new Button("Print"); myframe.add(text, BorderLayout.NORTH); myframe.add(this, BorderLayout.CENTER); myframe.add(printBtn, BorderLayout.SOUTH); myframe.setSize(new Dimension(300,340)); myframe.setLocation(150,140); myframe.addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent we) { System.exit(0); } }); text.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent ae) { repaint(); } }); printBtn.addActionListener(new FramePrinter(myframe)); myframe.setVisible(true); } /** * Paint the contents of the CircleDemoText canvas. * * @param g - a Graphics, hopefully a Graphics2D */ public void paint(Graphics g) { String st = text.getText(); if (st.length() == 0) return; if (g instanceof Graphics2D) { Dimension cd = getSize(); Point pt = new Point(cd.width / 2, cd.height / 2); int radius = (int)(pt.x * 0.84); g.setColor(circlecolor); g.drawArc(pt.x - radius, pt.y - radius, radius*2-1, radius*2-1, 0, 360); g.setColor(textcolor); g.setFont(myfont); drawCircleText((Graphics2D)g, st, pt, radius, -Math.PI/2, 1.0); } else { System.out.println("Cannot draw curved text without a Graphics2D"); } } /** * Draw a piece of text on a circular curve, one * character at a time. This is harder than it looks... * * This method accepts many arguments: * g - a Graphics2D ready to be used to draw, * st - the string to draw, * center - the center point of the circle (Point), * r - the radius of the circle, * a1 - the beginning angle on the circle to start, in radians, * af - the angle advance factor (usually 1.0) */ static void drawCircleText(Graphics2D g, String st, Point center, double r, double a1, double af) { double curangle = a1; double curangleSin; Point2D c = new Point2D.Double(center.x, center.y); char ch[] = st.toCharArray(); FontMetrics fm = g.getFontMetrics(); AffineTransform xform1, cxform; xform1 = AffineTransform.getTranslateInstance(c.getX(),c.getY()); for(int i = 0; i < ch.length; i++) { double cwid = (double)(getWidth(ch[i],fm)); if (!(ch[i] == ' ' || Character.isSpaceChar(ch[i]))) { cwid = (double)(fm.charWidth(ch[i])); cxform = new AffineTransform(xform1); cxform.rotate(curangle, 0.0, 0.0); String chstr = new String(ch, i, 1); g.setTransform(cxform); g.drawString(chstr, (float)(-cwid/2), (float)(-r)); } // compute advance of angle assuming cwid<