计算机中字体和绘制基线和字符串边框

本文介绍如何在Java中获取可用字体并演示了如何使用特定字体进行文本绘制的过程,包括字体的设置、获取字体渲染上下文及计算文本边界。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.要想知道某台特定计算器上允许使用的字体,就需要调用GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames方法,这个方法将返回一个字符型数组,其中包含了所有可用的字体名。下面这个程序将打印出系统上所有字体名:

import java.awt.*;
public class LocalGrapgics {
public static void main(String[] args)
{
	String[] fontNames = GraphicsEnvironment.getLocalGraphicsEnvironment().getAvailableFontFamilyNames();
	for(String fontName : fontNames)
		System.out.println(fontName);
}
}

运行结果如下:
这里写图片描述

绘制基线和字符串边框实例:

import java.awt.*;
import java.awt.font.*;
import java.awt.geom.*;
import javax.swing.*;
public class FontTest {
public static void main(String[] args)
{
	//事件分派线程中的执行代码
	EventQueue.invokeLater(() ->
	{
		JFrame frame = new FontFrame();
		frame.setTitle("FontTest");//确定该框架标题栏的文字
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//让程序简单退出的响应式语句
		frame.setVisible(true);//显示按钮
	});
}
}

class FontFrame extends JFrame
{
	public FontFrame()
	{
		add(new FontComponent());
		pack();//调整窗口大小,要考虑到其组件的首选大小
	}
}

class FontComponent extends JComponent
{
	private static final int DEFAULT_WIDTH = 300;
	private static final int DEFAULT_HEIGHT = 200;
	public void paintComponent(Graphics g)
	{
		Graphics2D g2 = (Graphics2D) g;
		String message = "Hello,World!";
		/*要想使用某种字体绘制字符
		 * 必须首先利用指定的字体名、字体风格和字体大小来创建Font类对象
		 * 第三个参数是以点数目计算的字体大小、
		 * 点数目的排版中普遍使用的表示字体大小的单位
		 * 每英寸包含72个点*/
		Font f = new Font("Serif",Font.BOLD,36);
		g2.setFont(f);//获取或设置当前的字体
		
		/*要想得到屏幕设备字体属性的描述对象
		 * 需要调用Graphics2D类中的getFontRenderContext方法
		 * 它将返回一个FontRenderContext类对象
		 * 可以直接将这个对象传递给Font类的getStringBounds方法
		 * getStringBounds方法将返回包围字符串的矩形
		*/
		//返回字体的字体绘制环境
		FontRenderContext context = g2.getFontRenderContext();
		
		//返回这个图形文本中,指定字体特征的字体绘制环境
		getFontRenderContext(); 

		/*
		返回包围这个字符串的矩形 
		矩形的起点为基线,矩形顶端的y坐标等于上坡度的负值。矩形的高度等于上坡度
		下坡度和行间距之和,宽度等于字符串的宽度
		*/
		Rectangle2D bounds = f.getStringBounds(message, context);
		
		
		double x = (getWidth() - bounds.getWidth()) / 2;
		double y = (getHeight() - bounds.getHeight()) / 2;
		
		double ascent = -bounds.getY();
		double baseY = y + ascent;
		
		//采用和当前字体和颜色绘制一个字符串,后两个参数分别是字符串开始的x坐标和字符串基线的y坐标
		g2.drawString(message, (int)x,(int)baseY);
		
		g2.setPaint(Color.LIGHT_GRAY);
		
		g2.draw(new Line2D.Double(x,baseY,x + bounds.getWidth(),baseY));
		
		Rectangle2D rect = new Rectangle2D.Double(x,y,bounds.getWidth(),bounds.getHeight());
		
		g2.draw(rect);
		
	
	}
	public Dimension getPreferrdsize()
	{
		return new Dimension(DEFAULT_WIDTH,DEFAULT_HEIGHT);
	}
}



运行结果如下:
这里写图片描述

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Αиcíеиτеǎг

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值