Как я могу загрузить несколько раз одно и то же буферизованное изображение на панель без необходимости повторного создания одного и того же буферизованного изображения? - PullRequest
0 голосов
/ 04 мая 2019

Если бы это было мое изображение:

private BufferedImage LVL140;

try

{        

LVL140 = ImageIO.read(new File("SplendorIm/LVL140.png"));

} catch (IOException e)

{

e.printStackTrace();

}

g.drawImage(LVL140,1050,0,null);

Как я могу несколько раз загрузить одно и то же буферизованное изображение на панель без необходимости повторного создания того же буферизованного изображения?

1 Ответ

0 голосов
/ 04 мая 2019

После загрузки изображения используйте while {} с Thread.sleep() и g.drawImage() внутри него.

Вот пример:

public class DrawSystem extends JPanel implements Runnable {

    private int width, height;
    private BufferedImage img;
    private boolean running;
    private Graphics2D g;

//Theses lines could be in a configuration, but let's do it here
    private void int FPS = 60;
    private long targetTime = 1000 / FPS;

    private BufferedImage LVL140;

    public DrawSystem(Dimension dimensions) {
        width = (int) dimensions.getWidth();
        height = (int) dimensions.getHeight();
            //here's your LVL140 image
        LVL140 = ImageIO.read(new File("SplendorIm/LVL140.png"));
    }

    //you just have to start the thred with (variable).start();
    @Override
        public void run() {
        img = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
        g = (Graphics2D) img.getGraphics();
        running = true;

        long start;
        long elapsed;
        long wait;

        while(running) {
            start = System.nanoTime();

            draw();
            drawToScreen();

            elapsed = System.nanoTime() - start;
            wait = targetTime - elapsed / 1000000;
            if(wait > 0) {
                try{
                    Thread.sleep(wait);
                } catch(Exception e) {
                    e.printStackTrace();
                }
            }

        }
    }

    //Draw pixels of "LVL140" on "img". You can draw others things without impact "LVL140" thanks to this
    private void draw() {
        g.drawImage(LVL140, 0, 0, null);
    }

//draw pixels of "img" on the JPanel.
    private void drawToScreen() {
        Graphics g2 = getGraphics();
        if(g2 != null) {
            g2.drawImage(img, 0, 0, width, height, null);
            g2.dispose();
        }
    }
}

Обратите внимание, что вы можете использовать addNotify(), а затем запустить Thread оттуда, но не смущайте себя, это ваши первые шаги в Java.

Juste создайте JFrame, добавьте DrawSystem и сделайте:

DrawSystem sys = new DrawSystem(new Dimension(1000, 500));
<(your JFrame)>.add(sys);
Thread th = new Thread(sys);
//call the `run()` method
th.start();

Как видите, вы создаете свой BufferedImage один раз, а затем используете его несколько раз в методе draw(). Я надеюсь, что это поможет вам.

...