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();
}
}
}
}
Java 绘制环形的文字 (Circle Text Demo)的更多相关文章
- winform 绘制label 中文字 - 摘
private void label2_Paint(object sender, PaintEventArgs e) {//绘制label中文字 string text = "Sri Lan ...
- openCV - 5~7 图像混合、调整图像亮度与对比度、绘制形状与文字
5. 图像混合 理论-线性混合操作.相关API(addWeighted) 理论-线性混合操作 用到的公式 (其中 α 的取值范围为0~1之间) 相关API(addWeighted) 参数1:输入图像M ...
- html5 canvas绘制环形进度条,环形渐变色仪表图
html5 canvas绘制环形进度条,环形渐变色仪表图 在绘制圆环前,我们需要知道canvas arc() 方 ...
- java.sql.SQLException:ORA-01861:文字和格式字符串不匹配
1.错误描述 java.sql.SQLException:ORA-01861:文字和格式字符串不匹配 2.错误原因 字段名为statis_date在数据库中存储的数据类型是Date,而在Java中拼接 ...
- 异常-----java.sql.SQLException:ORA-01861:文字和格式字符串不匹配
1.错误描述 java.sql.SQLException:ORA-01861:文字和格式字符串不匹配 2.错误原因 字段名为statis_date在数据库中存储的数据类型是Date,而在Java中拼接 ...
- 使用commons-net做FTP功能的异常 java.lang.ClassNotFoundException: org.apache.oro.text.regex.Malformed
最近使用Apache的commons-net.jar做FTP上传下载功能,点击“上传”的时候报错,如下: java.lang.ClassNotFoundException: org.apache.or ...
- CAD参数绘制多行文字(com接口)
在CAD设计时,需要绘制多行文字,用户可以设置设置绘制文字的高度等属性. 主要用到函数说明: _DMxDrawX::DrawMText 绘制一个多行文字.详细说明如下: 参数 说明 DOUBLE dP ...
- CAD参数绘制多行文字(网页版)
在CAD设计时,需要绘制多行文字,用户可以设置设置绘制文字的高度等属性. 主要用到函数说明: _DMxDrawX::DrawMText 绘制一个多行文字.详细说明如下: 参数 说明 DOUBLE dP ...
- CAD绘制一个单行文字(com接口VB语言)
主要用到函数说明: _DMxDrawX::DrawText 绘制一个单行文字.详细说明如下: 参数 说明 DOUBLE dPosX >文字的位置的X坐标 DOUBLE dPosY 文字的位置的Y ...
随机推荐
- 【Codeforces Round #502 (Div. 1 + Div. 2) 】
A:https://www.cnblogs.com/myx12345/p/9843032.html B:https://www.cnblogs.com/myx12345/p/9843050.html ...
- Python入门--11--自定义函数
使用def定义自定义函数 举个栗子: def myfristFunction(): print "we are 伐木累!" #输入myfristFunction() 会输出:we ...
- BZOJ 4034 [HAOI2015]树上操作(树链剖分)
题目链接 BZOJ4034 这道题树链剖分其实就可以了. 单点更新没问题. 相当于更新 [f[x], f[x]]这个区间. f[x]表示树链剖分之后每个点的新的标号. 区间更新的话类似DFS序,求出 ...
- T3054 高精度练习-文件操作 codevs
http://codevs.cn/problem/3054/ 题目描述 Description 输入一组数据,将每个数据加1后输出 输入描述 Input Description 输入数据:两行,第 ...
- Nginx常用命令(启动/重启/停止/测试配置文件/重新加载配置文件)
Nginx 安装后只有一个程序文件,本身并不提供各种管理程序,它是使用参数和系统信号机制对 Nginx 进程本身进行控制的. Nginx 的参数包括有如下几个: 使用: /usr/local/ngin ...
- svm、logistic regression对比
相同点:都是线性分类算法 不同点: 1.损失函数不同 LR:基于“给定x和参数,y服从二项分布”的假设,由极大似然估计推导 SVM: hinge loss + L2 regularization的标准 ...
- SQL ORDER BY 关键字
SQL ORDER BY 关键字 ORDER BY 关键字用于对结果集进行排序. SQL ORDER BY 关键字 ORDER BY 关键字用于对结果集按照一个列或者多个列进行排序. ORDER BY ...
- jobject和jclass
jclass和jobject的迷惑第一次使用JNI,实例引用(jobject)和类引用(jclass)让人觉得很困惑.实例引用与一个数组和java.lang.Object类或它的子类的实例对应.类引用 ...
- Ikki's Story IV - Panda's Trick (poj 3207 2-SAT)
Language: Default Ikki's Story IV - Panda's Trick Time Limit: 1000MS Memory Limit: 131072K Total S ...
- Effective C++ 条款四 确定对象被使用前已被初始化
1.对于某些array不保证其内容被初始化,而vector(来自STL)却有此保证. 2.永远在使用对象前初始化.对于无任何成员的内置类型,必须手工完成. int x = 0; c ...