文本绘制中的文字排版
一、
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);}
}
本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
