为什么导入字体会破坏代码的其他部分?
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 以相反的顺序绘制添加到任何给定面板的组件。
关于其他问题
你的绘画代码只是偶然有效。您不应该将所有组件直接添加到框架中。当组件彼此重叠时,Swing 并未设计为直接在 3 个维度上绘制组件。 Swing 被设计为具有父子关系。所以这意味着您将 "background" 面板添加到框架中。然后将包含按钮的面板添加到 "background" 并将 "health" 组件添加到背景。
与上述相关,您不应使用空布局。 Swing 被设计为与布局管理器一起使用。这将确保组件不会重叠。因此,在您的情况下,您可以对 "background" 面板使用 BorderLayout
。然后,您可以将 "buttons" 面板添加到 BorderLayout.PAGE_Start
并将 "health" 组件添加到 `BorderLayout.PAGE_END。这将确保组件位于背景面板的top/bottom。
不要设置边框的大小。相反,您使用 setExtendedState(JFrame.MAXIMIZED_BOTH)
属性。框架将是屏幕的大小。 "GamePanel" 将占据帧的所有 space。因此无需设置或使用硬编码值。
不要使用静态变量和方法。这表明设计不佳。您应该做的是创建一个 GamePanel
class,它实际上就是您的背景面板。 class 将包含游戏所需的实例变量。它将创建 "buttons" 面板和 "health" 组件并将其添加到自身。
变量名不应以大写字符开头。
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 以相反的顺序绘制添加到任何给定面板的组件。
关于其他问题
你的绘画代码只是偶然有效。您不应该将所有组件直接添加到框架中。当组件彼此重叠时,Swing 并未设计为直接在 3 个维度上绘制组件。 Swing 被设计为具有父子关系。所以这意味着您将 "background" 面板添加到框架中。然后将包含按钮的面板添加到 "background" 并将 "health" 组件添加到背景。
与上述相关,您不应使用空布局。 Swing 被设计为与布局管理器一起使用。这将确保组件不会重叠。因此,在您的情况下,您可以对 "background" 面板使用
BorderLayout
。然后,您可以将 "buttons" 面板添加到BorderLayout.PAGE_Start
并将 "health" 组件添加到 `BorderLayout.PAGE_END。这将确保组件位于背景面板的top/bottom。不要设置边框的大小。相反,您使用
setExtendedState(JFrame.MAXIMIZED_BOTH)
属性。框架将是屏幕的大小。 "GamePanel" 将占据帧的所有 space。因此无需设置或使用硬编码值。不要使用静态变量和方法。这表明设计不佳。您应该做的是创建一个
GamePanel
class,它实际上就是您的背景面板。 class 将包含游戏所需的实例变量。它将创建 "buttons" 面板和 "health" 组件并将其添加到自身。变量名不应以大写字符开头。