一、
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);
}
}