为什么导入字体会破坏代码的其他部分?

why is importing a font breaking other parts of code?

Modifiers.java:

package game;
import java.awt.*;
import java.io.*;
import javax.swing.*;
public class Modifiers  extends Data{
    public static void setupJcomponents(){
        frame.setUndecorated(true);
        frame.setSize(MW,MH);
        frame.setResizable(false);
        frame.setVisible(true);
        frame.setLayout(null);
        for(int btn=0; btn<4; btn++) {
            Buttons[btn] = new JPanel();
            Buttons[btn].setBounds(btn*100,0,100,100);
            Buttons[btn].setVisible(true);
            Buttons[btn].setBackground(new Color(btn*50,btn*50,btn*50));
            frame.getContentPane().add(Buttons[btn]);
        }
        menuBackground.setBounds(0,0,MW,MH);
        menuBackground.setVisible(true);
        menuBackground.setBackground(Color.black);
        healthIndicator.setText(String.valueOf(healthValue));
        healthIndicator.setFont(new Font("Terminal", Font.PLAIN, 100));
        healthIndicator.setBounds(600,600,100,100);
        healthIndicator.setForeground(Color.blue);
        try{
            PixelFont = Font.createFont(Font.TRUETYPE_FONT, new File("PixelFont.ttf"));
        } catch (IOException e) {
            PixelFont = new Font("Terminal", Font.PLAIN, 100);
        } catch(FontFormatException e) {
            PixelFont = new Font("Terminal", Font.PLAIN, 100);
        }
        GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
        ge.registerFont(PixelFont);
        frame.getContentPane().add(healthIndicator);
        frame.getContentPane().add(menuBackground);
    }
}

Data.java:

package game;
import java.awt.*;
import javax.swing.*;
public class Data { 
        // this is where I will declare and alter all variable that will be used
        public static JFrame frame = new JFrame();
        public static JLabel healthIndicator = new JLabel(); 
        public static JPanel Buttons[] = new JPanel[5];
        public static JPanel menuBackground = new JPanel();
        public static final Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
        public static final int MW = (int) screenSize.getWidth();
        public static final int MH = (int) screenSize.getHeight();
        public static Font PixelFont;
        public static int maxHealth = 100;
        public static int healthValue = maxHealth;

}

Frame.java:

package game;
public class Frame {
    public static void main(String[] args) {
        Modifiers.setupJcomponents();
    }
}

每当我朗姆酒 Frame.java 时,菜单背景就会消失,文本也会完全停止显示。但如果 .ttf 文件的路径是错误的,它只是跳过字体并使用默认字体。我怎样才能让这个字体正确加载以及不导致我的背景背景消失?我已经尝试更改.ttf文件的路径并将代码的各个部分变成注释,但即使健康指示器的字体是默认字体,这些错误仍然会发生,但是如果我尝试删除try-catch循环然后错误不再存在。

代码有各种各样的问题。不确定为什么字体会导致问题,但它与代码的整体结构有关,并且您没有按照设计使用的方式使用 Swing。

whenever i rum Frame.java the menu Background disappears and the text altogether stops showing up

似乎与上述问题直接相关的是 setVisible(true) 语句应该在所有组件都添加到框架之后执行。这将确保所有组件都已绘制。

请注意,这仍然只是偶然起作用,因为您碰巧最后将 "background" 面板添加到框架中。 Swing 以相反的顺序绘制添加到任何给定面板的组件。

关于其他问题

  1. 你的绘画代码只是偶然有效。您不应该将所有组件直接添加到框架中。当组件彼此重叠时,Swing 并未设计为直接在 3 个维度上绘制组件。 Swing 被设计为具有父子关系。所以这意味着您将 "background" 面板添加到框架中。然后将包含按钮的面板添加到 "background" 并将 "health" 组件添加到背景。

  2. 与上述相关,您不应使用空布局。 Swing 被设计为与布局管理器一起使用。这将确保组件不会重叠。因此,在您的情况下,您可以对 "background" 面板使用 BorderLayout。然后,您可以将 "buttons" 面板添加到 BorderLayout.PAGE_Start 并将 "health" 组件添加到 `BorderLayout.PAGE_END。这将确保组件位于背景面板的top/bottom。

  3. 不要设置边框的大小。相反,您使用 setExtendedState(JFrame.MAXIMIZED_BOTH) 属性。框架将是屏幕的大小。 "GamePanel" 将占据帧的所有 space。因此无需设置或使用硬编码值。

  4. 不要使用静态变量和方法。这表明设计不佳。您应该做的是创建一个 GamePanel class,它实际上就是您的背景面板。 class 将包含游戏所需的实例变量。它将创建 "buttons" 面板和 "health" 组件并将其添加到自身。

  5. 变量名不应以大写字符开头。