gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 17:42:58 25 4
gpt4 key购买 nike

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) 语句。这将确保所有组件都已绘制。

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

关于其他问题。

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

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

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

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

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

关于java - 为什么导入字体会破坏代码的其他部分?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58760214/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com