文本绘制中的文字排版

 

一、

1、文字基线

英文书写四线三格

文字基线baseline:指从下往上的第2根线

 文本绘制函数:drawString(str, x,y) 中的 y 指的是基线的位置

2、文本的测量

Font Size = Leading + Ascent + Descent

3、文本测量类:FontMetrics

  FontMetrics fm = g.getFontMetrics(font);

  int textWidth = fm.stringWidth( str );

  int fontSize = fm.getHeight();  // 字高

  int leading = fm.getLeading();

  int ascent = fm.getAscent();

  int descent = fm.getDescent(); // bottom->baseline 的高度

对于文本绘制,在指定区域的文字排版,类似于文字对齐,利用文本度量类进行排版。

由此可对文字设置具体的对齐方式:居中对齐,左对齐,右对齐,顶对齐,底对齐的混合(包含两个)

public class test1 extends JFrame {
    drawPanel draw=new drawPanel();
    public test1(String title){
    setTitle(title);
    setSize(600, 400);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    setContentPane(draw);

    }

    public static void main(String[] args) {
    new test1("绘制").setVisible(true);
    }
}
class drawPanel extends JPanel{

    @Override
    protected void paintComponent(Graphics g){
        Graphics2D g2=(Graphics2D)g;
        //设置平滑绘制
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
        g2.setColor(Color.red);
        Font font =new Font("宋体",Font.BOLD,20);
        g2.setFont(font);
        String str="你好啊agl";
        //创建一个区域
        Rectangle rec=new Rectangle(50,50,150,80);
        g2.drawRect(rec.x,rec.y,rec.width,rec.height);
        TextFormat tf=new TextFormat(rec,font,str,g2);
        Point p=tf.alignment(TextFormat.HORIZONTAL_CENTER,TextFormat.VERTICAL_CENTER);
        g2.drawString(str,p.x,p.y);

    }
}

注:所用的·构造函数,需要指定区域,所要绘制的文本,绘图对象

       所用到的常量:

                             public final static int HORIZONTAL_LEFT=0;
                             public final static int HORIZONTAL_CENTER=1;
                             public final static int HORIZONTAL_RIGTH=2;
                             public final static int VERTICAL_TOP=4;
                             public final static int VERTICAL_CENTER=5;
                             public final static int VERTICAL_BOTTOM=6;

二、

工具类:

/**
 * @author stardream  Email:stardream0000@163.com
 * @Description  对目标区域的文字进行排版
 * @ 2020/12/18 10:54
 */

public class TextFormat {
    /*
    @param target 目标区域
    @param wordFont 字体格式
    @param
     */
    private Rectangle target;
    private Font wordFont;
    private  String str;
    private Graphics2D g2D;
    private  FontMetrics fm;
    /*
    @param HORIZONTAL_LEFT
    @param HORIZONTAL_CENTER
    @param HORIZONTAL_RIGTH
    @param VERTICAL_TOP
    @param VERTICAL_CENTER
    @param VERTICAL_BOTTOM
     */
    public final static int HORIZONTAL_LEFT=0;
    public final static int HORIZONTAL_CENTER=1;
    public final static int HORIZONTAL_RIGTH=2;
    public final static int VERTICAL_TOP=4;
    public final static int VERTICAL_CENTER=5;
    public final static int VERTICAL_BOTTOM=6;
    public TextFormat(Rectangle target,Font wordFont,String str,Graphics2D g2D){
        this.target=target;
        this.wordFont=wordFont;
        this.str=str;
        this.g2D=g2D;
        fm=g2D.getFontMetrics(wordFont);
    }
    /*
    设置字体格式
    @return
     */
    public  static Font setTextFont(String name, int style, int sizePts ){
        return new Font(name,style,sizePts);
    }
    /*
    @return
     */
    public FontMetrics  getMetrics(){
        return fm;
    }
    /*
    @return 文本(字体)的宽度
     */
    private int getTextWidth(){
        return fm.stringWidth(str);
    }
    /*
    @return 文本(字体)的高度
     */
    private int getTextHeigth(){
        return fm.getHeight();
    }
    /*
    @return
     */
    private int getTextLeading(){
        return fm.getLeading();
    }
    /*
    @return
     */
    private int getTextAscent(){
        return fm.getAscent();
    }
    /*
    @return
     */
    private int getTextDescent(){
        return fm.getDescent();
    }
    /*
    @return 左对齐,顶对齐
     */
    private Point left_top(){
        Point p=new Point();
        p.x=target.x;
        p.y = target.y + getTextLeading() + getTextAscent();
        return p;
    }
    /*
    @return 左对齐,居中
     */
    private Point left_center(){
        Point p=new Point();
        p.x = target.x;
        p.y=target.y+target.height/2+(getTextAscent()+getTextLeading())/2-getTextDescent();
        return p;
    }
    /*
    @return 左对齐,底对齐
     */
    private Point left_bottom(){
        Point p=new Point();
        p.x=target.x;
        p.y=target.y+target.height-getTextDescent();
        return p;
    }
    /*
    @return 居中,顶对齐
     */
    private Point ceter_top(){
        Point p=new Point();
        p.x=target.x+(target.width-getTextWidth())/2;
        p.y = target.y + getTextLeading() + getTextAscent();
        return p;
    }
    /*
    @return 居中
     */
    private Point ceter(){
        Point p=new Point();
        p.x=target.x+(target.width-getTextWidth())/2;
        p.y = (target.y + ((target.height) / 2) + ((getTextAscent() + getTextLeading()) / 2)) - getTextDescent();
        return p;
    }
    /*
    居中,底对齐
     */
    private Point ceter_bottom(){
        Point p=new Point();
        p.x=target.x+(target.width-getTextWidth())/2;
        p.y=target.y+target.height-getTextDescent();
        return p;
    }
    /*
    @return 右对齐,顶对齐
     */
    private Point right_top(){
        Point p=new Point();
        p.x =target.x+target.width-getTextWidth();
        p.y= target.y + getTextLeading() + getTextAscent();
        return p;
    }
    /*
    @return  居中,右对齐
     */
    private Point right_center(){
        Point p=new Point();
        p.x =target.x+target.width-getTextWidth();
        p.y= (target.y + ((target.height) / 2) + ((getTextAscent() + getTextLeading()) / 2)) - getTextDescent();
        return p;
    }
    /*
    @return 右对齐,底对齐
     */
    private Point right_bottom(){
        Point p=new Point();
        p.x =target.x+target.width-getTextWidth();
        p.y= target.y+target.height-getTextDescent();
        return p;
    }
    /*
    得到晶计算后的坐标
    @return x,y
     */
    public Point alignment(int alignment1,int alignment2){
        int x=0;int y=0;
        if(alignment1==HORIZONTAL_LEFT&&alignment2==VERTICAL_TOP){
            x=left_top().x;
            y=left_top().y;
        }
        if(alignment1==HORIZONTAL_LEFT&&alignment2==VERTICAL_CENTER){
            x=left_center().x;
            y=left_center().y;
        }
        if(alignment1==HORIZONTAL_LEFT&&alignment2==VERTICAL_BOTTOM){
            x=left_bottom().x;
            y= left_bottom().y;
        }
        if(alignment1==HORIZONTAL_CENTER&&alignment2==VERTICAL_TOP){
            x=ceter_top().x;
            y=ceter_top().y;

        }
        if(alignment1==HORIZONTAL_CENTER&&alignment2==VERTICAL_CENTER){
            x=ceter().x;
            y=ceter().y;
        }
        if(alignment1==HORIZONTAL_CENTER&&alignment2==VERTICAL_BOTTOM){
            x=ceter_bottom().x;
            y=ceter_bottom().y;
        }
        if(alignment1==HORIZONTAL_RIGTH&&alignment2==VERTICAL_TOP){
            x=right_top().x;
            y=right_top().y;
        }
        if(alignment1==HORIZONTAL_RIGTH&&alignment2==VERTICAL_CENTER){
            x=right_center().x;
            y=right_center().y;
        }
        if(alignment1==HORIZONTAL_RIGTH&&alignment2==VERTICAL_BOTTOM){
            x=right_bottom().x;
            y=right_bottom().y;
        }
        return new Point(x,y);
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

霓乤

谢谢支持,菜鸟会继续努力..

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值