文本绘制中的文字排版

 

一、

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{@Overrideprotected 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);}
}

 


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部