Нарисуйте сетку изображений на JPanel, используя Graphics, а затем добавьте этот JPanel в JFrame несколько раз, не перерисовывая изображения каждый раз? - PullRequest
0 голосов
/ 16 марта 2019

В настоящее время я пытаюсь нарисовать большую сетку изображений на 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();

просто возвращает ноль.Что я могу сделать?

...