您的位置:首页 > 其它

文本字体

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在中央绘制文本

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节部分使用特殊字体
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: