【问题标题】:why is importing a font breaking other parts of code?为什么导入字体会破坏代码的其他部分?
【发布时间】:2020-03-04 17:04:59
【问题描述】:

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 文件的路径并将代码的各个部分转换为 cmets,但是即使运行状况指示器的字体是默认字体,这些错误仍然会发生,但是如果我尝试删除 try-catch循环然后错误不再存在。

【问题讨论】:

    标签: java swing fonts


    【解决方案1】:

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

    每当我朗姆 Frame.java 菜单背景消失并且文本完全停止显示

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

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

    关于其他问题。

    1. 您的绘画代码只是偶然起作用。您不应该将所有组件直接添加到框架中。当组件相互重叠时,Swing 并非设计为直接在 3 维中绘制组件。 Swing 被设计为具有父子关系。这意味着您将“背景”面板添加到框架中。然后将包含按钮的面板添加到“背景”,并将“健康”组件添加到背景。

    2. 与上述相关,您不应使用空布局。 Swing 旨在与布局管理器一起使用。这将确保组件不会重叠。因此,在您的情况下,您可以将BorderLayout 用于“背景”面板。然后您可以将“按钮”面板添加到BorderLayout.PAGE_Start,并将“健康”组件添加到`BorderLayout.PAGE_END。这将确保组件位于背景面板的顶部/底部。

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

    4. 不要使用静态变量和方法。这表明设计不佳。你应该做的是创建一个GamePanel 类,它本质上就是你的背景面板。此类将包含游戏所需的实例变量。它将创建“按钮”面板和“健康”组件并将其添加到自身。

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

    【讨论】:

    • 谢谢!我认为主要问题与我将所有东西都作为框架的子元素有关。
    猜你喜欢
    • 2020-11-14
    • 2017-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-08
    • 1970-01-01
    • 2022-07-05
    相关资源
    最近更新 更多