• Java 绘制环形的文字 (Circle Text Demo)


    1. [代码]CircleTextDemo.java     
    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<<radius
                if (i < (ch.length - 1)) {
                    double adv = cwid/2.0 + fm.getLeading() + getWidth(ch[i + 1],fm)/2.0;
          // Use of atan() suggested by Michael Moradzadeh
                    curangle += Math.atan(adv / r);
          // Original code was:
          // curangle += Math.sin(adv / r);
     
                }
            }
        }
     
        /**
         * Get the width of a given character under the
         * specified FontMetrics, interpreting all spaces as
         * en-spaces.http://www.huiyi8.com/meinv/siwa/
         */
        static int getWidth(char c, FontMetrics fm) {
            if (c == ' ' || Character.isSpaceChar(c)) {
                return fm.charWidth('n');
            }
            else {
                return fm.charWidth(c);
            }
        }
     
        public static void main(String args[]) {
            CircleTextDemo ctd;
            ctd = new CircleTextDemo();
        }
     
        class FramePrinter implements ActionListener {
       private Frame fr;
       public FramePrinter(Frame f) { fr = f; }
       public void actionPerformed(ActionEvent ae) {
           PrintJob pjob;
           pjob = fr.getToolkit().getPrintJob(fr,
              "Printing Circle Demo", null, null);
           if (pjob != null) {
          Graphics g = pjob.getGraphics();
          if (g != null) {
              g.translate(100,100);
              fr.printAll(g);
              g.dispose();
          }
          pjob.end();
           }
       }
        }
     
    }

  • 相关阅读:
    ActiveX在.NET 2005中的实现(三)
    SharePoint学习研究资源
    配置Excel Service的Excel Web Access 功能及应用
    SkyDrive 与 Hotmail 的 Office Web Apps
    ActiveX在.NET 2005中的实现(二)
    Sharepoint设置SMTP邮件发送服务器(使用中继服务器)
    SharePoint2010新功能
    Analysis自动处理
    NBear V3
    Server数据推送,长连接
  • 原文地址:https://www.cnblogs.com/xkzy/p/3895245.html
Copyright © 2020-2023  润新知