Search code examples
javaeclipseswinggraphicsgraphics2d

Java Library Graphics2D Doesn't Display Text as Correct Font


I'm trying to get the proper font to display using Java's Graphics2D library. I'm not sure what font is currently displayed. I am trying to include the font as part of the program so that the program can be used by people who don't have it. Eclipse doesn't claim it can't find the file, but the font still isn't right.

The font I want to use

OldStyle Font

What is currently displayed enter image description here

MainClass class

import java.io.File;
import java.io.IOException;
import java.awt.Font;
import java.awt.FontFormatException;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GraphicsEnvironment;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class MainClass extends JPanel{

   static final int WINDOW_WIDTH = 1600;
   static final int WINDOW_HEIGHT = 900;


   // Displays the game window.
   private static void displayGameWindow() {
      JFrame frame = new JFrame("Bandit King");
      frame.getContentPane().add(new MainClass());
      frame.setSize(WINDOW_WIDTH, WINDOW_HEIGHT);
      frame.setVisible(true);
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
   }


   // Imports a font.
   private static void registerFont() {
      try {
         GraphicsEnvironment ge = 
               GraphicsEnvironment.getLocalGraphicsEnvironment();
         Font f = Font.createFont(Font.TRUETYPE_FONT, new File("OLDSH.TTF"));
         ge.registerFont(f);

      } catch (IOException|FontFormatException e) {
         e.printStackTrace();
         System.out.println("ERROR loading font, switching to serif.");
         Font f = new Font("Serif", Font.PLAIN, 12);
      }
   }


   // Calls functions to display the screen
   @Override
   public void paint(Graphics g) {
      Dimension d = this.getPreferredSize();
      Graphics2D g2d = (Graphics2D) g;

      // default font settings
      String fontName = "OldStyle 1 HPLS";
      String fontType = "PLAIN";
      int[] color = {0, 0, 0};
      int fontSize = 25;

      // display game title
      String title = "Bandit King";
      int titleCentered = DisplayText.findCenter(g2d, title);
      DisplayText.displayText(g2d, 
            title, fontName, "BOLD", 
            color, 
            titleCentered, 50, 40);

      // display menu
      int yPos = 120;
      String[] menuArr = {
            "(a) Start a new game", 
            "(b) Load a saved game",
            "(c) Exit the game",
            "(d) Resume the game"};

      for(int i = 0; i < menuArr.length; i++) {
         DisplayText.displayText(g2d,
               menuArr[i], fontName, fontType, color, 40, yPos, fontSize);
         yPos += 60;
      }
   }


   public static void main(String[] args) {
      registerFont();
      displayGameWindow();
   }
}

DisplayText class

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;

public class DisplayText {
   /** 
    * Displays text to window
    * 
    * PARAMETERS:
    * g2d            A Graphics2D object
    * text           The text to be drawn to screen
    * fontName       The name of the font to be used.
    * fontType       Whether the font is bold, italic, or neither.
    * color          Array of length 3, to represent RGB color
    * xPos           The x-position of the text.    
    * yPos           The y-position of the text.
    * fontSize       The size of the font.
    */
   public static void displayText(Graphics2D g2d,
         String text, String fontName, String fontType, 
         int[] color,
         int xPos, int yPos, int fontSize) {


      // assign appropriate int according to fontType
      fontType = fontType.toLowerCase();
      int fontNum;
      switch(fontType) {
         case "bold" :
            fontNum = Font.BOLD;
            break;
         case "italic" :
            fontNum = Font.ITALIC;
            break;
         case "plain" :
            fontNum = Font.PLAIN;
            break;
         default :
            fontNum = Font.PLAIN;
            break;
      }

      // determine the font and color, draw the string.
      g2d.setFont(new Font(fontName, fontNum, fontSize));
      g2d.setColor(new Color(color[0], color[1], color[2]));
      g2d.drawString(text, xPos, yPos);
   }

   // Finds the x-position centered text should be at.
   public static int findCenter(Graphics2D g2d, String text) {
      int width = g2d.getFontMetrics().stringWidth(text);
      return (MainClass.WINDOW_WIDTH / 2) - (width * 2);
   }

}

Solution

  • I mispelled the font's name. Under the method registerFont, in the MainClass class, I typed..

    String fontName = "OldStyle 1 HPLS" 
    

    when I should've typed..

    String fontName = "OldStyle 1 HPLHS"
    

    Notice the additional "H".