How do you import a font?

48,726

Solution 1

'Airacobra Condensed' font available from Download Free Fonts.

Registered Font

import java.awt.*;
import javax.swing.*;
import java.net.URL;

class LoadFont {
    public static void main(String[] args) throws Exception {
        // This font is < 35Kb.
        URL fontUrl = new URL("http://www.webpagepublicity.com/" +
            "free-fonts/a/Airacobra%20Condensed.ttf");
        Font font = Font.createFont(Font.TRUETYPE_FONT, fontUrl.openStream());
        GraphicsEnvironment ge = 
            GraphicsEnvironment.getLocalGraphicsEnvironment();
        ge.registerFont(font);
        JList fonts = new JList( ge.getAvailableFontFamilyNames() );
        JOptionPane.showMessageDialog(null, new JScrollPane(fonts));
    }
}

OK, that was fun, but what does this font actually look like?

Display Font

import java.awt.*;
import javax.swing.*;
import java.net.URL;

class DisplayFont {
    public static void main(String[] args) throws Exception {
        URL fontUrl = new URL("http://www.webpagepublicity.com/" +
            "free-fonts/a/Airacobra%20Condensed.ttf");
        Font font = Font.createFont(Font.TRUETYPE_FONT, fontUrl.openStream());
        font = font.deriveFont(Font.PLAIN,20);
        GraphicsEnvironment ge =
            GraphicsEnvironment.getLocalGraphicsEnvironment();
        ge.registerFont(font);

        JLabel l = new JLabel(
            "The quick brown fox jumps over the lazy dog. 0123456789");
        l.setFont(font);
        JOptionPane.showMessageDialog(null, l);
    }
}

Solution 2

You can use GraphicsEnvironment.registerFont

http://docs.oracle.com/javase/6/docs/api/java/awt/GraphicsEnvironment.html#registerFont(java.awt.Font)

With this you can load a font from a .ttf file:

private static final Font SERIF_FONT = new Font("serif", Font.PLAIN, 24);

private static Font getFont(String name) {
    Font font = null;
    if (name == null) {
        return SERIF_FONT;
    }

    try {
        // load from a cache map, if exists
        if (fonts != null && (font = fonts.get(name)) != null) {
            return font;
        }
        String fName = Params.get().getFontPath() + name;
        File fontFile = new File(fName);
        font = Font.createFont(Font.TRUETYPE_FONT, fontFile);
        GraphicsEnvironment ge = GraphicsEnvironment
                .getLocalGraphicsEnvironment();

        ge.registerFont(font);

        fonts.put(name, font);
    } catch (Exception ex) {
        log.info(name + " not loaded.  Using serif font.");
        font = SERIF_FONT;
    }
    return font;
}

Solution 3

I have solved my own problem. I have done

URL fontUrl = new URL("file:///F:/Computer_Science/TexasLED.ttf");

That points to the font and works for me!

Share:
48,726
ComputerLocus
Author by

ComputerLocus

I enjoy helping people out as much as possible. I have struggled before with things and have gotten help. I want to pass on the knowledge I have been given to others.

Updated on October 04, 2020

Comments

  • ComputerLocus
    ComputerLocus over 3 years

    I'm wondering how you would go about importing a font.

    I'm trying to use a custom downloaded font but since most computers that would go to run this would not have this font as it's not a default font. How would I go about making the font work even if they don't have the font?

    I'm using it for a gameover screen and need to display a score with it and want the score text to be the same font. This is the image,

    enter image description here

    In case it matters the font name on my computer is Terminal

    Edit: I'm assuming it would have to have the font in the directory of the java file and there would be some way of using that but I'm not sure how. Or is there a better way?

    Edit2: I have found a nice tutorial on how to do it but need some help on how I go about using this... click me for link

    Edit3:

    URL fontUrl = new URL("http://www.webpagepublicity.com/" + "free-fonts/a/Airacobra%20Condensed.ttf");
    Font font = Font.createFont(Font.TRUETYPE_FONT, fontUrl.openStream());
    GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
    ge.registerFont(font);
    g.setFont(font);
    

    Error Message

    File: F:\Computer Science\draw.java  [line: 252]
    Error: F:\Computer Science\draw.java:252: font is not public in java.awt.Component; cannot be accessed from outside package
    

    Here is what I'm trying:

    URL fontUrl = new URL("http://img.dafont.com/dl/?f=badaboom_bb");
    Font font = Font.createFont(Font.TRUETYPE_FONT, fontUrl.openStream());
    GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
    ge.registerFont(font);
    g.setFont(font);
    

    Edit4:

    File fontfile = new File("TexasLED.ttf");
    File.toURI(fontfile).toURL(fontfile);
    URL fontUrl = new URL("fontfile");
    

    Error

    Error: F:\Computer Science\draw.java:250: toURI() in java.io.File cannot be applied to (java.io.File)
    
  • ComputerLocus
    ComputerLocus over 12 years
    I tried using this: URL fontUrl = new URL("http://www.webpagepublicity.com/" + "free-fonts/a/Airacobra%20Condensed.ttf"); Font font = Font.createFont(Font.TRUETYPE_FONT, fontUrl.openStream()); GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); ge.registerFont(font); }catch(Exception e) { } g.setFont(font); I got this error: font cannot be accessed from outside package
  • ecle
    ecle over 12 years
    @AndrewThompson It would be nice to come up with a fallback mechanism just in case the user is unable to load the font from Internet especially when the font doesn't have any good system font to substitute it.
  • Andrew Thompson
    Andrew Thompson over 12 years
    @eee (sigh) The point about loading a Font off the net is ..not the point, since it is not what I am suggesting. The act of hot-linking to a Font was merely to create an SSCCE. Do you have a better way to demonstrate loading a custom Font in a code that is 'SC' (self-contained)? Personally I'd include the Font in a Jar that is added to the run-time class-path of the app.
  • Andrew Thompson
    Andrew Thompson over 12 years
    @Mr.Pallazzo BTW - sorry for hi-jacking your answer. I feel that it should be your answer that gets the 'tick'. I just turned your suggestion into an SSCCE (or 2, with pretty screen-shots).
  • Andrew Thompson
    Andrew Thompson over 12 years
    @eee ..continued after 5 min. limit. .. No fuss, no muss. OTOH the OP is insisting on a File based location, so some of my other comments (not necessarily on this answer) also refer to loading a Font from a File.
  • ecle
    ecle over 12 years
    @AndrewThompson You point is taken... I just want to address the limitation of hot-linking a font in a non-networked environment. The best still is either to include the fonts inside a jar as resources or to get them from outside a jar (from a file directory or font file cache). It depends on font licensing as well. In my case with the current project, I am not allowed to embed licensed fonts inside a jar. So, I have to access the font files either from a special folder under the installation folder or to install them as system fonts so they can be used in the application.
  • Andrew Thompson
    Andrew Thompson over 12 years
    @eee "I just want to address the limitation of hot-linking a font in a non-networked environment." And that is a good point, thanks for high-lighting the perils. (re. Font licensing) "So, I have to access the font files either from a special folder" (shudder) That is unfortunate. Still, we gotta' do what we gotta' do. I won't begin to describe some of the licensing hoops I had to leap through in order to create a project based around 4 holy testaments. ;)
  • ylun.ca
    ylun.ca about 10 years
    This answer seems to work for only half the fonts on that site, any ideas why? Also, are there any other sites that this method can be used with? The fonts on the site provided are, imo, ugly.
  • Andrew Thompson
    Andrew Thompson about 10 years
    @ylun.za "any ideas why?" Provide an MCVE (Minimal Complete and Verifiable Example) that fails. "..are there any other sites that this method can be used with?" It was never intended that 'real world' apps get their fonts by hot-linking to an internet site! Download the font and include it in one of the application Jars.
  • ylun.ca
    ylun.ca about 10 years
    I see. And simply try another url; one that i found did not work was the "Amiga Forever" font.
  • Andrew Thompson
    Andrew Thompson about 10 years
    @ylun.za I'm not going searching that site for the font you mention. If you want me to try it, post an MCVE, like I did.