文本字体
2016-06-16 12:10
330 查看
In this blog post:
1.字体相关知识与概念:字体系列,字体,基线与坡度
2.代码:面板0.75部分绘制中央文本
3.概要总结
一、相关知识简介:
字体系列(fontFamily):字体系列,个人认为仅仅是指字体的名字而已。不包含字体的风格(粗体与斜体...)和字体大小
字体:字体含有特定的字体大小,字体风格,是某一个字体系列中的特定的一员,比如宋体+BOLD是一个字体,宋体+ITALIC又是另一个字体。
基线与坡度(下图):
回想小学时刚刚用的线格本,你就很快明白基线的概念。
坡度,分为上坡度和下坡度,上坡度即基线到坡顶(字母K的上界)的距离,下坡度即是基线到坡底(字母g的下界)的距离
行间距,某一行坡底与下一行坡顶的距离
字体的高度,是指两个基线的距离,可以推导出行间距=上坡度+下坡度+行间距
baseline 基线
descent 下坡度
ascent 上坡度
在JAVA中,drawString(String ,x , y )其中y就是指基线所在的位置,所有了解这个只是还是很必要的
二、代码段
这里是完整的一段代码,在面板下0.75在中央绘制文本
边界矩形(getStringBounds(...)) 以该矩形基线为X轴,以最左边宽为Y轴,Y轴方向向下,getX(),getY()左上角定点相当原点(基线与左边宽的交点)的坐标。
绘制文本步骤:
得到字体上下文 , Graphics类中的getFontRenderContext()
得到边框矩形 , 注意该边框矩形各个参数意义getX(),getY()
得到线的度量,Font中非静态函数,getLineMetrics(String arg0 , FontRenderContext)
剩下就是计算坐标值
如有兴趣可以参考《JAVA核心技术卷1》中的7.7节部分使用特殊字体
1.字体相关知识与概念:字体系列,字体,基线与坡度
2.代码:面板0.75部分绘制中央文本
3.概要总结
一、相关知识简介:
字体系列(fontFamily):字体系列,个人认为仅仅是指字体的名字而已。不包含字体的风格(粗体与斜体...)和字体大小
字体:字体含有特定的字体大小,字体风格,是某一个字体系列中的特定的一员,比如宋体+BOLD是一个字体,宋体+ITALIC又是另一个字体。
基线与坡度(下图):
回想小学时刚刚用的线格本,你就很快明白基线的概念。
坡度,分为上坡度和下坡度,上坡度即基线到坡顶(字母K的上界)的距离,下坡度即是基线到坡底(字母g的下界)的距离
行间距,某一行坡底与下一行坡顶的距离
字体的高度,是指两个基线的距离,可以推导出行间距=上坡度+下坡度+行间距
baseline 基线
descent 下坡度
ascent 上坡度
在JAVA中,drawString(String ,x , y )其中y就是指基线所在的位置,所有了解这个只是还是很必要的
二、代码段
这里是完整的一段代码,在面板下0.75在中央绘制文本
import java.awt.*; import javax.swing.*; import java.awt.font.*; import java.awt.geom.*; public class Test { public static void main(String[] args) { // TODO Auto-generated method stub EventQueue.invokeLater(new Runnable(){ @Override public void run(){ TestFontFrame frame=new TestFontFrame(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setLocationByPlatform(true); frame.setVisible(true); } }); } } class TestFontFrame extends JFrame{ public TestFontFrame(){ setTitle("Font Test"); add(new TestFontPanel()); pack(); } } class TestFontPanel extends JPanel{ private String message; private Font showFont; private int width; private int height; //在屏幕四分之三处显示文字 public TestFontPanel(){ Dimension size=Toolkit.getDefaultToolkit().getScreenSize(); width=3*size.width/5; height=3*size.height/5; message=new String("Hello world!"); this.setBackground(SystemColor.window); } @Override public Dimension getPreferredSize(){ return new Dimension(width,height); } @Override public void paintComponent(Graphics g){ super.paintComponent(g); Graphics2D g2=(Graphics2D)g; showFont=g2.getFont(); //设置风格与大小 showFont=showFont.deriveFont(Font.BOLD+Font.ITALIC,20.0f); g2.setFont(showFont); FontRenderContext context=g2.getFontRenderContext(); //得到边界矩形,注意边界矩形各个参数作用,我会在下面总结中说明 Rectangle2D bounds=showFont.getStringBounds(message, context); g2.draw(new Line2D.Double(0, getHeight()/4, getWidth(), getHeight()/4)); //得到二分之一处的坐标 double x=(getWidth()-bounds.getWidth())/2; double y=getHeight()/4+(getHeight()*0.75-bounds.getHeight( 4000 ))/2; //得到基线的Y坐标 double baseLine=y-bounds.getY(); g2.drawString(message, (int)x, (int)baseLine); //如何得到下坡度,行间距,这里是得到下坡度线 //LineMetrics lineMetrics=showFont.getLineMetrics(message, context); //Line2D deacsent=new Line2D.Double(0,baseLine+lineMetrics.getDescent(),getWidth(),baseLine+lineMetrics.getDescent()); //g2.draw(deacsent); } }三、概要总结
边界矩形(getStringBounds(...)) 以该矩形基线为X轴,以最左边宽为Y轴,Y轴方向向下,getX(),getY()左上角定点相当原点(基线与左边宽的交点)的坐标。
绘制文本步骤:
得到字体上下文 , Graphics类中的getFontRenderContext()
得到边框矩形 , 注意该边框矩形各个参数意义getX(),getY()
得到线的度量,Font中非静态函数,getLineMetrics(String arg0 , FontRenderContext)
剩下就是计算坐标值
如有兴趣可以参考《JAVA核心技术卷1》中的7.7节部分使用特殊字体
相关文章推荐
- 太原理工大学实习有感
- phpexcel 导出Demo
- sqlAlchemy 按DateTime字段的年或月进行group_by查询
- 排序(六)非比较排序
- 柴俊理金:升息泡汤黄金跳涨,FED鸽派施压原油
- Android Studio-SVN代码下载,提交,冲突解决方案
- 类的编码基础
- 第十三周项目4-立体类族共有的抽象类
- maven添加本地jar包
- 背水一战 Windows 10 (17) - 动画: ThemeTransition(过渡效果)
- c# 多态的美丽(虚方法、抽象、接口实现)
- 如何修改myeclipse的内存?
- spring学习之@SessionAttributes
- Java学习基础篇(-)类和对象
- JavaScript学习笔记九:变量作用域
- 一个类搞定UIScrollView那些事儿
- 一个类搞定UIScrollView那些事儿
- 为什么哈希存取比较快?使用它需要付出什么代价
- Netty-Mina深入学习与对比(一)
- 2、pip2.7安装Ansible