使用Java在窗口中水平居中放置文本

时间:2018-10-07 21:24:54

标签: java swing fonts graphics2d fontmetrics

我试图弄清楚如何使用Graphics2D和FontMetrics在窗口中水平居中放置文本。我做了一个方法,希望将它更改为Font类型后可以测量字符串的长度,但是并不能很好地使文本居中。

如何正确居中显示文字?

标题的居中位置不够enter image description here

我的MainClass类:

setText()

我的DisplayText类:

import java.io.File;
import java.io.IOException;
import java.awt.Font;
import java.awt.FontFormatException;
import java.awt.Color;
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() {
      Color tan = new Color(155, 136, 120);

      JFrame frame = new JFrame("Bandit King");
      frame.setBackground(tan);
      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;
      g.fillRect(0,  0,  d.width, d.height);

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

      // display game title
      String[] title = {"Bandit King"};
      int titlePos = DisplayText.findHorizontalCenter(g2d, title[0], d.width);
      DisplayText.displayText(g2d, 
            title, fontName, "BOLD", 
            color, 
            titlePos, 70, 60, 1);
      g2d.drawRect(0, 0, d.width - 1, d.height - 1);

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

      DisplayText.displayText(g2d,
            menuArr, fontName, fontType, color, 40, 210, fontSize, 2);
   }


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

2 个答案:

答案 0 :(得分:2)

int x = MainClass.WINDOW_WIDTH / 2 - width;

应该是

int x = MainClass.WINDOW_WIDTH / 2 - width/2;

答案 1 :(得分:2)

尝试设置字体大小之前获取文本的宽度。