使用自定义字体 [java.io.IOException:读取字体数据时出错。]

Posted

技术标签:

【中文标题】使用自定义字体 [java.io.IOException:读取字体数据时出错。]【英文标题】:Using Custom Fonts [java.io.IOException: Error reading font data.] 【发布时间】:2013-05-13 08:55:33 【问题描述】:

标题不允许我说问题,所以实际的错误消息是 -

java.io.IOException: Problem reading font data.
at java.awt.Font.createFont(Unknown Source)
at AddFont.createFont(AddFont.java:11)
at MainFrame$1.run(MainFrame.java:105)
at java.awt.event.InvocationEvent.dispatch(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$000(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)

代码是-

     public static void main(String[] args) 
javax.swing.SwingUtilities.invokeLater(new Runnable() 
 public void run() 
    try 
        AddFont addFont = new AddFont();
        addFont.createFont();
     catch (Exception e) 
        e.printStackTrace();
    
    createGUI();

  //public void run() Closing
);

还有我用来获取AddFont addFont的文件-

import java.awt.Font;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.InputStream;


public class AddFont extends MainFrame
public void createFont()
Font ttfBase = null;
    Font telegraficoFont = null;
try 
    InputStream myStream = new BufferedInputStream(new FileInputStream(FONT_PATH_TELEGRAFICO));
    ttfBase = Font.createFont(Font.TRUETYPE_FONT, myStream);
    telegraficoFont = ttfBase.deriveFont(Font.PLAIN, 24);
 catch (Exception ex) 
    ex.printStackTrace();
    System.err.println("Font not loaded.");




我被指示创建一个新线程,因为这是与我的另一个问题不同的问题。

为什么会出现这个问题,我该如何解决? 我的 imageFolder 中有我的 TELEGRAFICO.TTF 字体,这实际上只是我的资源文件夹。我用

   public static final String FONT_PATH_TELEGRAFICO = "imageFolder/TELEGRAFICO.TTF";

呼唤我的道路。

我做错了什么?

编辑 - 我不再收到该错误消息,也没有收到“未加载字体”。除了我在其中使用该方法的文件之外,我如何在其他类文件中使用该字体?

(我想在多个类文件中的按钮上使用该字体。我在这里尝试使用它 -

regButton = new JButton();
regButton.setText("Foo");
regButton.setAlignmentX(Component.CENTER_ALIGNMENT);
regButton.setFont(telegraficoFont);

但它说 telegraficoFont 无法解析为变量。 (因为它在不同的类文件中。)

我该如何解决这个问题?再次感谢您的帮助。

【问题讨论】:

代替AddFont.class.getResourceAsStream(FONT_PATH_TELEGRAFICO) 试试Thread.currentThread().getContextClassLoader().getResourceAsStream(FONT_PATH_TELEGRAFICO) @Perception 好的,那么我该怎么处理第二部分,即 Font telegraficoFont = Font.createFont(Font.TRUETYPE_FONT,telegraficoFontAdd);该代码删除了变量 telegraficoFontAdd。 使用完整的包路径访问字体,例如/com/mydomain/imageFolder/TELEGRAFICO.TTF。 请发布完整的错误堆栈跟踪。 @Ravi Trivedi,消息中已编辑完整错误。 【参考方案1】:

在某些情况下,原因是正在运行的实例无法写入 Java 临时目录 (java.io.tmpdir)。

如果你在tomcat上运行,可能是你删除了tomcat安装的临时目录,或者文件夹权限错误。

(tomcat 文件夹)/temp

【讨论】:

【参考方案2】:

由于您对可能的font file locatingfont stream creation 有疑问,

试试这个 >> Issue loading custom font AND http://forums.devshed.com/showpost.php?p=2268351&postcount=2

要回答您的问题"how to make this function easy to use everywhere",请执行以下操作:

    public class AddFont extends MainFrame 

    private static Font ttfBase = null;
    private static Font telegraficoFont = null;
    private static InputStream myStream = null;
    private static final String FONT_PATH_TELEGRAFICO = "imageFolder/TELEGRAFICO.TTF";

    public Font createFont() 


            try 
                myStream = new BufferedInputStream(
                        new FileInputStream(FONT_PATH_TELEGRAFICO));
                ttfBase = Font.createFont(Font.TRUETYPE_FONT, myStream);
                telegraficoFont = ttfBase.deriveFont(Font.PLAIN, 24);               
             catch (Exception ex) 
                ex.printStackTrace();
                System.err.println("Font not loaded.");
            
            return telegraficoFont;
    

然后在你的调用类中:

    public class Test 

    public static Font font = null;

    public static void main(String[] args) 
        javax.swing.SwingUtilities.invokeLater(new Runnable() 
            public void run() 
                try 
                    if (font == null) 
                        font = AddFont.createFont();
                    
                 catch (Exception e) 
                    e.printStackTrace();
                
                createGUI();

             // public void run() Closing
        );
    

【讨论】:

试过了,必须进行一些编辑才能在我的项目文件中工作,它可以工作。谢谢!【参考方案3】:

在某些情况下,您的运行环境中可能缺少Fontconfig。安装后一切正常。

例如,

yum install fontconfig

【讨论】:

这对我来说是个问题(在最小的 CI 机器上)【参考方案4】:

你可以尝试安装“dejavu-sans-fonts”和fontconfig,它可以工作

【讨论】:

以上是关于使用自定义字体 [java.io.IOException:读取字体数据时出错。]的主要内容,如果未能解决你的问题,请参考以下文章

服务端和客户端互聊

python中matplotlib自定义设置图像标题使用的字体类型:获取默认的字体族及字体族中对应的字体自定义设置图像标题使用的字体类型

在 Android 中使用自定义字体

使用可下载字体作为自定义 Snackbar 字体

未使用 tcpdf 自定义字体

Android使用自定义字体(自定义view)