почему импорт шрифта нарушает другие части кода? - PullRequest
0 голосов
/ 08 ноября 2019

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Цикл, то ошибок больше нет.

1 Ответ

4 голосов
/ 08 ноября 2019

Существуют всевозможные проблемы с кодом. Не совсем понятно, почему шрифты вызывают проблему, но это как-то связано с общей структурой вашего кода, и вы не используете Swing так, как это было задумано.

всякий раз, когдаiRum Frame.java, фон меню исчезает, и текст вообще перестает отображаться

То, что напрямую связано с вышеупомянутым вопросом, заключается в том, что оператор setVisible(true) должен выполняться ПОСЛЕ того, как все компоненты имеютбыли добавлены в кадр. Это гарантирует, что все компоненты будут закрашены.

Обратите внимание, что это все равно будет работать только случайно, потому что вы случайно добавили панель «фон» к кадру последним. Swing рисует компоненты в обратном порядке, которые добавляются к любой данной панели.

По поводу других проблем.

  1. ваш код рисования работает только случайно. Вы не должны добавлять все свои компоненты непосредственно во фрейм. Качели не предназначены для непосредственного окрашивания компонентов в трех измерениях, когда они перекрывают друг другаSwing разработан, чтобы иметь родительские дочерние отношения. Так что это будет означать, что вы добавите свою «фоновую» панель в рамку. Затем вы добавляете панель с кнопками к «фону» и добавляете компонент «здоровья» к фону.

  2. В связи с вышеизложенным НЕ следует использовать нулевую разметку. Swing был разработан для использования с менеджером макета. Это гарантирует, что компоненты не перекрываются. Так что в вашем случае вы можете использовать BorderLayout для «фоновой» панели. Затем вы можете добавить панель «кнопки» в BorderLayout.PAGE_Start и компонент «здоровье» в BorderLayout.PAGE_END. Это обеспечит нахождение компонентов вверху / внизу фоновой панели.

  3. Не устанавливайте размер рамки. Вместо этого вы используете свойство setExtendedState(JFrame.MAXIMIZED_BOTH). Рамка будет размером экрана. «GamePanel» будет занимать все пространство кадра. Поэтому нет необходимости устанавливать или использовать жестко закодированные значения.

  4. Не используйте статические переменные и метод. Это указывает на плохой дизайн. То, что вы должны делать, - это создать класс GamePanel, который по сути будет вашей фоновой панелью. Этот класс будет содержать переменные экземпляра, необходимые для игры. Это создаст панель «кнопки» и компонент «здоровье» и добавит его к себе.

  5. Имена переменных НЕ должны начинаться с символов верхнего регистра.

...