java Font 自定义字体

这篇博客介绍了在Java项目中使用XChart生成报表时遇到的中文显示为方框的错误。该问题是由于Linux系统缺少字体导致的。作者选择了通过JavaFont引入外部字体来解决,具体步骤包括将黑体字体文件读取到系统目录,并创建新的Font对象供程序使用。这种方法确保了在Linux环境下项目中的图表能正确显示中文。
摘要由CSDN通过智能技术生成

记录一下项目中的小问题

1、背景

因为需要用java做报表,发现XChart很好用,但项目在容器中部署后发现,XChart生成的图表中文变成一个个方框,查看资料知,这是由于linux系统中缺少字体导致

2、解决办法

  1. 在系统中安装字体
  2. 使用Java Font 引入外部字体

在这边我们使用的是第二种方法
我们就从项目中自带字体,这里选择黑体(字体下载地址),然后把字体读取到系统的某个目录下,接着根据这个字体文件新建一个Font字体,供调用。(注意:项目打成jar后无法读取项目目录下的字体资源,必须通过getResourceAsStream)

 public Font getFont(int style,int size) {
 		// 字体在resource下的路径
        String fontfilename = "/font/simhei.ttf";
        InputStream is = this.getClass().getResourceAsStream(fontfilename);
        //返回一个指定字体类型和输入数据的font
        Font actionJson = null;
        try {
            actionJson = Font.createFont(Font.TRUETYPE_FONT,is);
        } catch (FontFormatException e) {
            throw new RuntimeException(e);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        //通过复制此 Font 对象并应用新样式和大小,创建一个新 Font 对象。
        Font actionJsonBase = actionJson.deriveFont(style,size);
        return actionJsonBase;

    }
Java中,`java.awt.Font`类用于表示字体自定义TTc字体通常指的是TrueType Collection字体,即包含多个字体的单一文件。使用`java.awt.Font`类来操作这类字体,可以通过以下方式进行: 1. 使用`Font.createFont()`方法创建字体实例。这个方法接受一个输入流和一个布尔值,表示是否进行字体平滑处理。对于TTc字体,你需要从文件中读取流。 ```java FileInputStream fontStream = new FileInputStream("path/to/your/fontcollection.ttc"); Font ttcFont = Font.createFont(Font.TRUETYPE_FONT, fontStream); ``` 2. 如果你只想要字体集合中的特定字体,可以通过字体名称获取。TTc字体可以包含多个字体家族,每个字体家族中可能有多种样式(如常规、粗体、斜体等)。可以通过遍历并根据名称来确定所需的字体。 ```java Map map = ttcFont.getAvailableFontFamilyNames(); for (String familyName : map) { if (familyName.equals("YourDesiredFontFamilyName")) { ttcFont = ttcFont.deriveFont(Font.PLAIN); // 获取一个基本样式版本的字体 } } ``` 3. 使用`deriveFont`方法来获得特定样式的字体字体样式包括`Font.PLAIN`, `Font.BOLD`, `Font.ITALIC`等,而`deriveFont`方法允许你创建具有特定样式的字体副本。 ```java Font derivedFont = ttcFont.deriveFont(Font.BOLD | Font.ITALIC); ``` 4. 最后,如果要使用这个字体,需要将其注册到当前图形环境。 ```java GraphicsEnvironment genv = GraphicsEnvironment.getLocalGraphicsEnvironment(); genv.registerFont(derivedFont); // 现在可以在程序中使用这个字体 ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值