В настоящее время я пытаюсь нарисовать большую сетку изображений на JPanel, а затем добавить эту панель в JFrame 60 раз в секунду.У меня есть эта функция при рисовании на панель, созданную классом, имеющим «extends JPanel», и рисовании на эту JPanel с использованием paintComponent (Graphics g).Однако проблема заключается в том, что, поскольку класс вызывается 60 раз в секунду (при повторном вызове paintComponent каждый раз), приложение может работать только со скоростью 2-3 кадра в секунду.Решение, которое я придумал, состояло в том, чтобы использовать следующий код для рисования изображения в JPanel только один раз, создав метод рисования, который нужно вызывать вручную, а затем просто добавив этот JPanel в JFrame 60 раз в секунду.
public class Testing extends JPanel {
public static void main(String[] args) {
testing.run(frame); //This is called by another class in the program
}
JFrame frame = new JFrame();
JPanel panelContainingDrawnImages;
Image[][] MAP; // Initialized based on the world.txt file it receives
public void tick() { // Is called 60 times a second
frame.add(this); // Add the class's main panel, - which now has the Images painted to it - to the frame used by all classes in the application
}
public void drawImageToPanel(Graphics g) {
for (int c = 0; c < MAP.length; c++) { // The x axis of the game's map
for (int r = 0; r < MAP[c].length; r++) { // The y axis of the game's map
g.drawImage(MAP[c][r], xPos, yPos, null);
}
}
}
public void run(JFrame frame) {
frame = this.frame; // The JFrame from this method is passed in from another class
Graphics g = getGraphics();
drawImageToPanel(g);
}
}
Однако по какой-то причине строка
Graphics g = getGraphics();
возвращает ноль, и поэтому вызов
drawImageToPanel(g);
завершается неудачно, возвращая исключение NullPointerException, как только появляется какая-либо графикаDraw.
Мой вопрос таков: как я могу нарисовать группу изображений на JPanel только один раз, при этом вызывая метод JFrame.add (panel) много раз (60 раз в секунду).Это кажется невозможным с помощью paintComponent (), так как он запускается каждый раз, когда вызывается class.tick (), который вызывается 60 раз в секунду, то есть 2D-массив изображений рисуется снова и снова, что означаетпрограмма работает со скоростью всего несколько кадров в секунду вместо желаемых 60 кадров в секунду.Я также изо всех сил пытаюсь сделать это, используя метод рисования, который должен вызываться вручную, так как
g = getGraphics();
просто возвращает ноль.Что я могу сделать?